Chapter overview

In this chapter, I focus on the second of my three key questions about the development of representations of mental life: How are the conceptual units that anchor representations of mental life organized in relation to each other, and how does this organization change over development? As in Chapter III, to address this question I draw on data from all of the current studies (Studies 1-4); for details about the methods of these studies, see Chapter II. The goal of this chapter is to provide “snapshots” of the organization of conceptual units in early childhood, middle childhood, and adulthood.

General analysis plan

High-level overview

My goal in this chapter is to examine the relationships among the “conceptual units” identified in Chapter III. How does a participant’s assessment of one conceptual unit for a particular target character (e.g., the degree to which he or she indicates that a beetle is capable of the physiological sensations of the BODY) affect that participant’s assessments of other conceptual units for that target character (e.g., his or her assessment of the beetle’s capaciteis in the domains of HEART or MIND)?

I focus in particular on the possibility that the mental capacity attributions documented by the studies included in this dissertation—re-analyzed as indicators of the broader “conceptual units” identified in Chapter III—might shed light on the hierarchical organization of these conceptual units, i.e., which conceptual units might be more basic or fundamental vs. more complex, and whether any of these conceptual units might or might not be considered to depend on the presence of others. In Chapter II, I illustrated this with the following example: If many participants endorse capacities associated with Conceptual Unit A without endorsing capacities associated with Conceptual Unit B, but very few participants do the reverse (endorsing capacities associated with Conceptual Unit B but not Conceptual Unit A), this provides some evidence that Conceptual Unit A is more basic or fundamental than Conceptual Unit B, or that Conceptual Unit B somehow depends on (perhaps requires) Conceptual Unit A.

Here I will translate this general interest in the relationships among conceptual units, as well as the specific intuition about how to detect the kinds of asymmetries that would be the signature of hierarchical relationships, into a specific analysis plan to be applied to each of these datasets in turn.

Details of analyses

Unlike the previous chapter, in which I employed a canonical approach to identifying latent constructs through analyses of correlation structures—exploratory factor analysis (EFA)—in this chapter there is no tried-and-true method for meeting my analysis goals. Instead, I chart my own course through these datasets, using the EFA solutions reported in Chapter II to score participants’ endorsements of each conceptual unit for the particular target character(s) that they assessed, examining visualizations of the complicated relationships among these endorsements, and then conducting more targeted statistical analyses of one particular aspect of these relationships: the possibility of asymmetries in the endorsements of these conceptual units.

Scoring endorsements of conceptual units

The first step in these analyses is to transform participants’ ratings of individual mental capacities into “scores” that indicate the extent to which they endorsed a particular conceptual unit for the target character(s) that they were assigned to assess. To do this, I make use of the EFAs presented in Chapter II—which originally served to identify a set of conceptual units in a particular sample—to a new end: the construction of “scales” for each of these conceptual units. Scale construction is a common use of EFA and similar dimensionality reduction analyses (if anything, more common than using EFA to make the kinds of theoretical arguments featured in Chapter II).

For each EFA solution, I construct a scale for each of the factors (conceptual units) identified by that solution. First, I sort each of the mental capacities included in that study into categories based on their loadings on each of the factors in that solution. For each mental capacity, I identify the “dominant” factor as the factor with the largest positive factor loading. For example, if the mental capacity feel happy had loadings of 0.60 on the BODY factor, 0.70 on the HEART factor, and 0.30 on the MIND factor, I would sort it into the HEART category. For each factor, I take the six highest-loading items as a candidate scale, then “drop” the capacities with the smallest factor loadings on their respective dominant factors until I have the same number of mental capacities in each category. For example, if the BODY factor were the dominant factor for nine mental capacities, the HEART factor for six mental capacities, and the MIND factor for five capacities, for each factor I would keep only the capacities with the five highest positive loadings on that factor, in order to construct three scales of equal length (and a maximum length of six items).

To calculate scores on these scales, I take the average of all of mental capacities for each scale. This yields a dataset in which each participant is associated with one score for each of the conceptual units identified in the relative EFA solution, for each of the target characters that that participant assessed.

In this chapter, I apply this method to all of the three-factor solutions for adult samples as presented in Chapter II (Studies 1-4), yielding BODY, HEART, and MIND scores for each target character as assessed by each participant. (I ignore the aberrant four-factor solution for adults in Study 2 suggested by one of the three factor retention protocols considered in that chapter, since this was the only study out of the seven considered in which a four-factor solution appeared to add any value beyond the robust BODY-HEART-MIND framework common to all studies. [XX APPENDIX B?])

For child samples, I apply this method both to the solutions emerging from children’s own data and to the corresponding adult solutions for the studies in question. This allows me to explore both the relationships among children’s own conceptual units, and the relationships among a fully adult-like set of conceptual units (presumably, the conceptual units that these children will eventually come to agree on as they mature into adults).

For “older” children (7-9y of age; Studies 2 and 3), this means examining two sets of three conceptual units for each sample of children: (1) BODY, HEART, and MIND as defined by adults in that study; and (2) BODY, HEART, and MIND as defined by the children themselves. Because the EFAs for older children and adults are so similar (see Chapter II), I expect the outcomes of these two approaches to constructing BODY, HEART, and MIND scales to yield very similar results in this age group.

For “younger” children, this means examining multiple sets of conceptual units for each sample of children, including (1) BODY, HEART, and MIND as defined by adults in that study; and (2) varying sets of 2-4 conceptual units as defined by EFA of children’s own responses, using different factor retention protocols. The EFAs of younger children’s responses were less reliable, and less adult-like, than those of older children. As a consequence, I expect the outcomes of these different approaches to constructing scales for each conceptual unit to yield rather different results in this age group.

The reader should note that this is far from the only way to approach “scoring” participants on these conceptual units. In particular, I could have examined factor scores—summaries of each factor (conceptual unit) based on a participant’s responses to all mental capacities and the relationships between all mental capacities and all factors included in that EFA solution—rather than constructing “scales” in the way I have just outlined. However, much like z-scores, factor scores indicate where a participant falls in relation to other participants in the sample, and do not provide the kind of absolute score that is key to my goal in this chapter, which is to analyze relationships among factors in terms of the extent to which individual participants indicated that target characters “possessed” the conceptual units BODY, HEART, and MIND. [XX APPENDIX B?]

Even within the “scale” approach described in this section, there are many parameters of this analysis that I could have set differently. For example, I could have considered absolute factor loadings rather than raw factor loadings, which would allow for mental capacities that loaded especially strongly negatively on a particular factor to contribute (negatively) to scores on that conceptual unit; I could have omitted the step of making the scales for all factors within a single EFA sotluion equal length; I could have chosen to use only the top 4 or 5 mental capacities across all EFA solutions, or to set no limit on the number of items in a scale; or I could have implemented absolute thresholds for how strongly a mental capacity must load on a factor in order to count toward the score for that conceptual unit, or absolute limits on the degree to which a mental capacity can “cross-load” on non-dominant factors and still count toward the score for any one conceptual unit. [XX APPENDIX B?] However, these kinds of details differ quite dramatically across studies and age groups. For example, in some samples there are no strong negative factor loadings, and in others there are; if I considered absolute loadings rather than raw loadings, I could end up comparing scores from a “bipolar” scale in one sample to scores from a “unipolar” scales in another sample, making the comparison more difficult to interpret. Likewise, some EFA solutions tended to feature generally weaker factor loadings than others; if I were to impose absolute thresholds for the strength of factor loadings, I could end up comparing scores from scales of wildly different lengths across samples. In my view, the analysis decisions outlined above maximize comparability across studies and age groups—the primary goal of this chapter. (Note, however, that in the analysis code for this chapter I have included easy short cuts for the interested reader to explore different options for each of these parameters.)

Visualizing relationships

XX

outline:

  • for any sample, I have identified relevant conceptual units (chapter II) and scored each participant’s endorsement of each of these units for their assigned target character(s) (previous section)
  • now, I want to assess the relationships among these endorsements
  • but I don’t really know what to expect, and these relationships could be very complex
  • so, start with holistic, exploratory visualization: scatterplots of pairs of conceptual units

Targeting the possibility of asymmetries

XX

outline:

  • now, a more targeted approach to one particular aspect of these relationships: asymmetries
  • reminder of basic intuition: in this sample, do participants tend to endorse A without B? B without A? is there an asymmetry here?
  • connect to the visualizations: asymmetries of points around the y=x line of equivalence
  • one way to boil this down to a number: difference scores (for each pair), comparisons to 0 via bayesian regressions
  • for any pair: if 0, no evidence for hierarchy. if non-zero, some evidence.
  • comparisons across pairs: further from 0, more hierarchical.
  • caveat 1: these are post-hoc analyses! but still using confirmatory stats.
  • caveat 2: scores of (0,0) treated same as scores of (6,6), or anywhere in between.

Study 1: An adult endpoint

In the context of this dissertation, Study 1 serves the role of describing a developmental endpoint for conceptual representations of mental life. In this chapter, I focus on what these studies can reveal about the relationships among the conceptual units discussed in Chapter III. These analyses were not part of the original publication of these studies (Weisman et al., 2017).

Special notes on data processing and analysis

As noted in Chapter II, in the original analysis of these datasets responses were recoded to run from -3 to +3 before analyses (Weisman et al., 2017); in this dissertation, I maintain the 0-6 coding for comparability to Studies 2-4.

Results

Study 1a

In Study 1a, 405 US adults each assessed a single target character on 40 mental capacities. This study employed the “edge case” variant of the general approach, with participants randomly assigned to assess either a beetle or a robot. (See Chapter II and Weisman et al., 2017, for detailed methods.)

Scale construction

Following the steps described in “General analysis plan,” above, yielded BODY, HEART, and MIND scales of 6 items each; see Table 4.1.

Visualization

XX

Analysis of asymmetries

XX

Study 1b

Study 1b was a direct replication of Study 1a: 406 US adults each assessed a single target character (either a beetle or a robot) on 40 mental capacities. (See Chapter II and Weisman et al., 2017, for detailed methods.)

Scale construction

Following the steps described in “General analysis plan,” above, yielded BODY, HEART, and MIND scales of 6 items each; see Table 4.1.

Visualization

XX

Analysis of asymmetries

XX

Study 1c

In Study 1c, 200 US adults each assessed two target characters on 40 mental capacities. Like Studies 1a and 1b, this study employed the “edge case” variant of the general approach; but in this study, all participants assessed both of these target characters side by side (with left-right position counterbalaned across participants). (See Chapter II and Weisman et al., 2017, for detailed methods.)

Scale construction

Following the steps described in “General analysis plan,” above, yielded BODY, HEART, and MIND scales of 6 items each; see Table 4.1.

Visualization

XX

Analysis of asymmetries

XX

Study 1d

In Study 1d, 431 US adults each assessed a single target character on 40 mental capacities. Unlike Studies 1a-1c, this study employed the “many characters” variant of the general approach, in which participants were randomly assigned to assess one of the following 21 target characters: an adult, a child, an infant, a person in a persistent vegetative state, a fetus, a chimpanzee, an elephant, a dolphin, a bear, a dog, a goat, a mouse, a frog, a blue jay, a fish, a beetle, a microbe, a robot, a computer, a car, or a stapler. (See Chapter II and Weisman et al., 2017, for detailed methods.)

Scale construction

Following the steps described in “General analysis plan,” above, yielded BODY, HEART, and MIND scales of 6 items each; see Table 4.1.

Visualization

XX

Analysis of asymmetries

XX

Discussion

XX

Table 4.1: Scales for each of the conceptual units (factors) identified by EFA for US Adults in Studies 1a-1d (see Chapter III). A checkmark indicates that a mental capacity was included in a scale for a particular study.
Capacity Study 1a Study 1b Study 1c Study 1d
BODY scale
getting hungry
experiencing pain
feeling tired
experiencing fear
experiencing pleasure
having free will
being conscious
having desires
feeling calm
HEART scale
feeling embarrassed
experiencing pride
feeling love
experiencing guilt
holding beliefs
feeling disrespected
feeling depressed
telling right from wrong
MIND scale
remembering things
recognizing someone
sensing temperatures
communicating with others
seeing things
perceiving depth
detecting sounds
working toward a goal
making choices

Study 2: Conceptual change between middle childhood (7-9y) and adulthood

In Study 2, 200 US adults and 200 US children between the ages of 7.01-9.99 years (median: 8.31y) each assessed a single target character on 40 mental capacities. To make the study appropriate for children in this age range, the wording of some the 40 mental capacities employed in Study 1 was modified to use more age-appropriate vocabulary, and participants responded on a 3-point scale (“no,” coded as 0; “kinda,” coded as 0.5, “yes,” coded as 1). This study employed the “edge case” variant of the general approach, with participants randomly assigned to assess either a beetle or a robot. (See Chapter II for detailed methods.)

Special notes on data processing and analysis

Results

Adults

Scale construction

Following the steps described in “General analysis plan,” above, yielded BODY, HEART, and MIND scales of 6 items each; see Table 4.2.

Visualization

Analysis of asymmetries

XX

Children (7-9y)

Scale construction

Following the steps described in “General analysis plan,” above, yielded BODY, HEART, and MIND scales of 6 items each; see Table 4.2.

Visualization

Using adults’ scales

XX

Using children’s own scales

XX

Analysis of asymmetries

Using adults’ scales

XX

Developmental comparison

XX

Using children’s own scales

XX

Discussion

XX

Table 4.2: Scales for each of the conceptual units (factors) identified by EFA for US Adults and children in Study 2 (see Chapter III). A checkmark indicates that a mental capacity was included in a scale for a particular sample.
Capacity Adults Children, 7-9y
BODY scale
get hungry
feel pain
feel scared
feel tired
feel safe
smell things
feel sick...
HEART scale
feel proud
feel joy
feel sad
feel happy
feel love
feel guilty
get hurt feelings
MIND scale
figure out how to do things
make choices
recognize somebody else
sense...far away
remember things
see things
be aware of itself
be aware of things
sense temperatures

Study 3: Conceptual change over early and middle childhood (4-9y)

In Study 3, 116 US adults, 125 “older” children (7.08-9.98 years; median: 8.56y), and 124 “younger” children (4-6.98 years; median: 5.03y) each assessed a single target character on 20 mental capacities. To make the study appropriate for children in this age range, participants assessed a subset of the 40 mental capacities employed in Study 2, chosen to represent the three “conceptual units” revealed by Studies 1-2 (BODY, HEART, and MIND) and to cover a similar range of mental capacities as Studies 1-2. As in Study 2, participants responded on a 3-point scale (“no,” coded as 0; “kinda,” coded as 0.5, “yes,” coded as 1). This study employed the “diverse characters” variant of the general approach, with participants randomly or pseudo-randomly assigned to assess either one of the following 9 characters: an elephant, a goat, a mouse, a bird, a beetle, a teddy bear, a doll, a robot, or a computer. (See Chapter II for detailed methods.)

Special notes on data processing and analysis

Results

Adults

Scale construction

Following the steps described in “General analysis plan,” above, yielded BODY, HEART, and MIND scales of 6 items each; see Table 4.3.

Visualization

XX

Analysis of asymmetries

XX

Children (7-9y)

Scale construction

Following the steps described in “General analysis plan,” above, yielded BODY, HEART, and MIND scales of 6 items each; see Table 4.3.

Visualization

Using adults’ scales

XX

Using children’s own scales

XX

Analysis of asymmetries

Using adults’ scales

XX

Using children’s own scales

XX

Children (4-6y)

Scale construction

Three-factor solution

Following the steps described in “General analysis plan,” above, yielded BODY*, HEART*, and MIND scales of 5 items each; see Table 4.3.

Two-factor solution

Following the steps described in “General analysis plan,” above, yielded BODY-HEART and MIND scales of 6 items each; see Table 4.3.

Visualization

Using adults’ scales

XX

Using children’s own scales (three-factor solution)

XX

Using children’s own scales (three-factor solution)

XX

Analysis of asymmetries

Using adults’ scales

XX

Developmental comparison
Using children’s own scales (three-factor solution)

XX

Using children’s own scales (two-factor solution)

XX

Discussion

XX

Table 4.3: Scales for each of the conceptual units (factors) identified by EFA for US Adults, older children, and younger children in Study 3 (see Chapter III). For younger children, this includes scales for both three- and two-factor EFA solutions. A checkmark indicates that a mental capacity was included in a scale for a particular sample. The conceptual units of younger children differed substantially from those of older children and adults, such that some mental capacities were included in different scales across age groups (e.g., feel scared was part of the BODY scale for older children and adults, but part of the HEART* scale for younger children). In these cases, the name of the scale is provided (rather than a checkmark).
Younger children, 4-6y
Capacity Adults Older children, 7-9y 3-factor solution 2-factor solution
BODY scale
feel pain
get hungry BODY-HEART
feel tired
smell things
feel scared HEART*
feel sick... BODY-HEART
get angry BODY-HEART
HEART scale
feel happy BODY-HEART
feel guilty MIND MIND
get hurt feelings BODY*
feel embarrassed
feel proud BODY-HEART
feel love
feel sad BODY-HEART
MIND scale
sense...far away
sense temperatures
figure out how to do things
be aware of things
remember things
make choices

Study 4: A focus on early childhood (4-5y)

In Study 4, 104 US adults and 43 US children between the ages of 4.02-5.59 years (median: 4.73y) each assessed two target characters on 18 mental capacities. To make the study appropriate for children in this age range, this study employed a new set of 18 mental capacities (some but not all of which were used in Studies 1-3). In addition, participants were presented with a more child-friendly visual representation of the 3-point response scale (“no,” coded as 0; “kinda,” coded as 0.5, “yes,” coded as 1). This study employed the “edge case” variant of the general approach, with participants assessing both a beetle or a robot in sequence (with order counterbalanced across participants). (See Chapter II for detailed methods.)

Special notes on data processing and analysis

Results

Adults

Scale construction

Following the steps described in “General analysis plan,” above, yielded BODY, HEART, and MIND scales of 5 items each; see Table 4.4.

Visualization

XX

Analysis of asymmetries

XX

Children (4-5y)

Scale construction

Three-factor solution

Following the steps described in “General analysis plan,” above, yielded BODY, HEART, and MIND scales of 3 items each; see Table 4.4.

Four-factor solution

Following the steps described in “General analysis plan,” above, yielded BODY (nausea), BODY (other), HEART*, and MIND* scales of 3 items each; see Table 4.4.

Visualization

Using adults’ scales

XX

Using children’s own scales (three-factor solution)

XX

Using children’s own scales (four-factor solution)

XX

Analysis of asymmetries

Using adults’ scales

XX

Using children’s own scales (three-factor solution)

XX

Using children’s own scales (four-factor solution)

XX

Discussion

XX

Table 4.4: Scales for each of the conceptual units (factors) identified by EFA for US Adults and children in Study 4 (see Chapter III). For children, this includes scales for both three- and four-factor EFA solutions. A checkmark indicates that a mental capacity was included in a scale for a particular sample. The conceptual units of younger children differed substantially from those of adults, such that some mental capacities were included in different scales across age groups (e.g., love someone was part of the HEART scale for adults, but part of the MIND* scale in the four-factor solution for younger children). In these cases, the name of the scale is provided (rather than a checkmark).
Children, 4-5y
Capacity Adults 3-factor solution 4-factor solution
BODY scale
get thirsty BODY (other)
feel hungry BODY (other)
smell things BODY (nausea)
feel tired BODY (nausea)
feel sick BODY (nausea)
HEART scale
love someone MIND*
get sad
hate someone
feel sorry
get lonely
MIND scale
figure things out
remember things
know stuff
think
hear BODY (other)

General discussion

XX

Chapter conclusion

In this chapter, I explored a second aspect of conceptual representations of mental life among US children and adults: The relationships among conceptual units. Studies 2-4 are consistent with the following theory: XX.

As in Chapter III, I urge the reader to remember that this is not the only possible interpretation of the pattern of results presented here; additional studies—in particular, studies designed to test the hypothesis that XX— could provide converging evidence or could challenge this theoretical interpretation. Instead, the primary role of the re-analysis discussed here has been to inspire the hypothesis stated in the previous paragraph and to the foundation for future tests of this hypothesis, in turn refining a general theory of this aspect of conceptual development.

In the next chapter, I apply the same exploratory spirit to the third and final aspect of conceptual representations of mental life: the application or deployment of these conceptual units in reasoning about various kinds of beings.

TO DO

  • implement overall plan
    • study 1: adults for each sample = 4 regs total
    • study 2: adults for each sample (2); children’s for child sample (1); comparison (1) = 4 regs total
    • study 3: adults for each sample (3); comparison (1) = 4 regs total
    • study 4: adults for each sample (2); comparison (1) = 3 regs total
  • make regression tables
    • study 1 (4 regs: studies 1a-1d)
    • study 2 (3 regs: adult scales for adults, children; child scales)
    • study 2 (1 reg: developmental comparison)
    • study 3 (3 regs: adult scales for adults, older, young children)
    • study 3 (1 reg: developmental comparison)
    • study 4 (2 regs: adult scles for adults, children)
    • study 4 (1 reg: developmental comparison)
  • move to appendix
    • study 2: adults’ 4-factor solution for adults? for 7-9yo?
    • study 3: 7-9yo for 7-9yo (1); 4-6yo for 4-6yo x 2 (2)
    • study 4: 4-6yo for 4-6yo x 2 (2)
  • reconsider adding to appendix
    • study 3: 7-9yo for 4-6yo?
    • all studies: comparisons across pairs of units (instead of separate regs for each unit)?
LS0tCnRpdGxlOiAiQ2hhcHRlciBJVjogQ2hhbmdlcyBpbiBvcmdhbml6YXRpb24gb2YgY29uY2VwdHVhbCB1bml0cyIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHllcwogICAgdG9jX2RlcHRoOiA0CiAgICB0b2NfZmxvYXQ6IHllcwphbHdheXNfYWxsb3dfaHRtbDogeWVzCi0tLQoKYGBge3IgZ2xvYmFsX29wdGlvbnMsIGluY2x1ZGUgPSBGfQprbml0cjo6b3B0c19jaHVuayRzZXQoZmlnLndpZHRoID0gMywgZmlnLmFzcCA9IDAuNjcsCiAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlID0gRiwgZWNobyA9IEYpCmBgYAoKYGBge3J9CiMgIyBmb3Iga25pdHRpbmcgdG8gLmRvY3gKIyBvdXRwdXQ6CiMgICB3b3JkX2RvY3VtZW50OgojICAgICByZWZlcmVuY2VfZG9jeDogIi4vd29yZC1zdHlsZXMtcmVmZXJlbmNlLmRvY3giCiMgYWx3YXlzX2FsbG93X2h0bWw6IHllcwoKIyAjIGZvciBrbml0dGluZyB0byAubmIuaHRtbCAKIyBvdXRwdXQ6CiMgICBodG1sX25vdGVib29rOgojICAgICB0b2M6IHllcwojICAgICB0b2NfZGVwdGg6IDQKIyAgICAgdG9jX2Zsb2F0OiB5ZXMKYGBgCgpgYGB7cn0KIyBydW4gdXItc2V0dXAgc2NyaXB0ICh3aGljaCBydW5zIG90aGVyIHNjcmlwdHMpCnNvdXJjZSgiLi9zY3JpcHRzL19TRVRVUC5SIikKIAojIGxvYWQgaW4gRUZBcyAmIG5hbWVzIGZyb20gQ2hhcHRlciBJSUkKc291cmNlKCIuL3NjcmlwdHMvc3RvcmVkX2NoMDMuUiIpCmBgYAoKCiMgQ2hhcHRlciBvdmVydmlldwoKSW4gdGhpcyBjaGFwdGVyLCBJIGZvY3VzIG9uIHRoZSBzZWNvbmQgb2YgbXkgdGhyZWUga2V5IHF1ZXN0aW9ucyBhYm91dCB0aGUgZGV2ZWxvcG1lbnQgb2YgcmVwcmVzZW50YXRpb25zIG9mIG1lbnRhbCBsaWZlOiBfSG93IGFyZSB0aGUgY29uY2VwdHVhbCB1bml0cyB0aGF0IGFuY2hvciByZXByZXNlbnRhdGlvbnMgb2YgbWVudGFsIGxpZmUgb3JnYW5pemVkIGluIHJlbGF0aW9uIHRvIGVhY2ggb3RoZXIsIGFuZCBob3cgZG9lcyB0aGlzIG9yZ2FuaXphdGlvbiBjaGFuZ2Ugb3ZlciBkZXZlbG9wbWVudD9fIEFzIGluIENoYXB0ZXIgSUlJLCB0byBhZGRyZXNzIHRoaXMgcXVlc3Rpb24gSSBkcmF3IG9uIGRhdGEgZnJvbSBhbGwgb2YgdGhlIGN1cnJlbnQgc3R1ZGllcyAoU3R1ZGllcyAxLTQpOyBmb3IgZGV0YWlscyBhYm91dCB0aGUgbWV0aG9kcyBvZiB0aGVzZSBzdHVkaWVzLCBzZWUgQ2hhcHRlciBJSS4gVGhlIGdvYWwgb2YgdGhpcyBjaGFwdGVyIGlzIHRvIHByb3ZpZGUgInNuYXBzaG90cyIgb2YgdGhlIG9yZ2FuaXphdGlvbiBvZiBjb25jZXB0dWFsIHVuaXRzIGluIGVhcmx5IGNoaWxkaG9vZCwgbWlkZGxlIGNoaWxkaG9vZCwgYW5kIGFkdWx0aG9vZC4KCgojIEdlbmVyYWwgYW5hbHlzaXMgcGxhbgoKIyMgSGlnaC1sZXZlbCBvdmVydmlldwoKTXkgZ29hbCBpbiB0aGlzIGNoYXB0ZXIgaXMgdG8gZXhhbWluZSB0aGUgcmVsYXRpb25zaGlwcyBhbW9uZyB0aGUgImNvbmNlcHR1YWwgdW5pdHMiIGlkZW50aWZpZWQgaW4gQ2hhcHRlciBJSUkuIEhvdyBkb2VzIGEgcGFydGljaXBhbnQncyBhc3Nlc3NtZW50IG9mIG9uZSBjb25jZXB0dWFsIHVuaXQgZm9yIGEgcGFydGljdWxhciB0YXJnZXQgY2hhcmFjdGVyIChlLmcuLCB0aGUgZGVncmVlIHRvIHdoaWNoIGhlIG9yIHNoZSBpbmRpY2F0ZXMgdGhhdCBhIGJlZXRsZSBpcyBjYXBhYmxlIG9mIHRoZSBwaHlzaW9sb2dpY2FsIHNlbnNhdGlvbnMgb2YgdGhlIEJPRFkpIGFmZmVjdCB0aGF0IHBhcnRpY2lwYW50J3MgYXNzZXNzbWVudHMgb2Ygb3RoZXIgY29uY2VwdHVhbCB1bml0cyBmb3IgdGhhdCB0YXJnZXQgY2hhcmFjdGVyIChlLmcuLCBoaXMgb3IgaGVyIGFzc2Vzc21lbnQgb2YgdGhlIGJlZXRsZSdzIGNhcGFjaXRlaXMgaW4gdGhlIGRvbWFpbnMgb2YgSEVBUlQgb3IgTUlORCk/CgpJIGZvY3VzIGluIHBhcnRpY3VsYXIgb24gdGhlIHBvc3NpYmlsaXR5IHRoYXQgdGhlIG1lbnRhbCBjYXBhY2l0eSBhdHRyaWJ1dGlvbnMgZG9jdW1lbnRlZCBieSB0aGUgc3R1ZGllcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3NlcnRhdGlvbuKAlHJlLWFuYWx5emVkIGFzIGluZGljYXRvcnMgb2YgdGhlIGJyb2FkZXIgImNvbmNlcHR1YWwgdW5pdHMiIGlkZW50aWZpZWQgaW4gQ2hhcHRlciBJSUnigJRtaWdodCBzaGVkIGxpZ2h0IG9uIHRoZSBfaGllcmFyY2hpY2FsIG9yZ2FuaXphdGlvbl8gb2YgdGhlc2UgY29uY2VwdHVhbCB1bml0cywgaS5lLiwgd2hpY2ggY29uY2VwdHVhbCB1bml0cyBtaWdodCBiZSBtb3JlIGJhc2ljIG9yIGZ1bmRhbWVudGFsIHZzLiBtb3JlIGNvbXBsZXgsIGFuZCB3aGV0aGVyIGFueSBvZiB0aGVzZSBjb25jZXB0dWFsIHVuaXRzIG1pZ2h0IG9yIG1pZ2h0IG5vdCBiZSBjb25zaWRlcmVkIHRvIGRlcGVuZCBvbiB0aGUgcHJlc2VuY2Ugb2Ygb3RoZXJzLiBJbiBDaGFwdGVyIElJLCBJIGlsbHVzdHJhdGVkIHRoaXMgd2l0aCB0aGUgZm9sbG93aW5nIGV4YW1wbGU6IElmIG1hbnkgcGFydGljaXBhbnRzIGVuZG9yc2UgY2FwYWNpdGllcyBhc3NvY2lhdGVkIHdpdGggQ29uY2VwdHVhbCBVbml0IEEgd2l0aG91dCBlbmRvcnNpbmcgY2FwYWNpdGllcyBhc3NvY2lhdGVkIHdpdGggQ29uY2VwdHVhbCBVbml0IEIsIGJ1dCB2ZXJ5IGZldyBwYXJ0aWNpcGFudHMgZG8gdGhlIHJldmVyc2UgKGVuZG9yc2luZyBjYXBhY2l0aWVzIGFzc29jaWF0ZWQgd2l0aCBDb25jZXB0dWFsIFVuaXQgQiBidXQgbm90IENvbmNlcHR1YWwgVW5pdCBBKSwgdGhpcyBwcm92aWRlcyBzb21lIGV2aWRlbmNlIHRoYXQgQ29uY2VwdHVhbCBVbml0IEEgaXMgbW9yZSBiYXNpYyBvciBmdW5kYW1lbnRhbCB0aGFuIENvbmNlcHR1YWwgVW5pdCBCLCBvciB0aGF0IENvbmNlcHR1YWwgVW5pdCBCIHNvbWVob3cgZGVwZW5kcyBvbiAocGVyaGFwcyByZXF1aXJlcykgQ29uY2VwdHVhbCBVbml0IEEuIAoKSGVyZSBJIHdpbGwgdHJhbnNsYXRlIHRoaXMgZ2VuZXJhbCBpbnRlcmVzdCBpbiB0aGUgcmVsYXRpb25zaGlwcyBhbW9uZyBjb25jZXB0dWFsIHVuaXRzLCBhcyB3ZWxsIGFzIHRoZSBzcGVjaWZpYyBpbnR1aXRpb24gYWJvdXQgaG93IHRvIGRldGVjdCB0aGUga2luZHMgb2YgYXN5bW1ldHJpZXMgdGhhdCB3b3VsZCBiZSB0aGUgc2lnbmF0dXJlIG9mIGhpZXJhcmNoaWNhbCByZWxhdGlvbnNoaXBzLCBpbnRvIGEgc3BlY2lmaWMgYW5hbHlzaXMgcGxhbiB0byBiZSBhcHBsaWVkIHRvIGVhY2ggb2YgdGhlc2UgZGF0YXNldHMgaW4gdHVybi4gCgojIyBEZXRhaWxzIG9mIGFuYWx5c2VzCgpVbmxpa2UgdGhlIHByZXZpb3VzIGNoYXB0ZXIsIGluIHdoaWNoIEkgZW1wbG95ZWQgYSBjYW5vbmljYWwgYXBwcm9hY2ggdG8gaWRlbnRpZnlpbmcgbGF0ZW50IGNvbnN0cnVjdHMgdGhyb3VnaCBhbmFseXNlcyBvZiBjb3JyZWxhdGlvbiBzdHJ1Y3R1cmVz4oCUZXhwbG9yYXRvcnkgZmFjdG9yIGFuYWx5c2lzIChFRkEp4oCUaW4gdGhpcyBjaGFwdGVyIHRoZXJlIGlzIG5vIHRyaWVkLWFuZC10cnVlIG1ldGhvZCBmb3IgbWVldGluZyBteSBhbmFseXNpcyBnb2Fscy4gSW5zdGVhZCwgSSBjaGFydCBteSBvd24gY291cnNlIHRocm91Z2ggdGhlc2UgZGF0YXNldHMsIHVzaW5nIHRoZSBFRkEgc29sdXRpb25zIHJlcG9ydGVkIGluIENoYXB0ZXIgSUkgdG8gc2NvcmUgcGFydGljaXBhbnRzJyBlbmRvcnNlbWVudHMgb2YgZWFjaCBjb25jZXB0dWFsIHVuaXQgZm9yIHRoZSBwYXJ0aWN1bGFyIHRhcmdldCBjaGFyYWN0ZXIocykgdGhhdCB0aGV5IGFzc2Vzc2VkLCBleGFtaW5pbmcgdmlzdWFsaXphdGlvbnMgb2YgdGhlIGNvbXBsaWNhdGVkIHJlbGF0aW9uc2hpcHMgYW1vbmcgdGhlc2UgZW5kb3JzZW1lbnRzLCBhbmQgdGhlbiBjb25kdWN0aW5nIG1vcmUgdGFyZ2V0ZWQgc3RhdGlzdGljYWwgYW5hbHlzZXMgb2Ygb25lIHBhcnRpY3VsYXIgYXNwZWN0IG9mIHRoZXNlIHJlbGF0aW9uc2hpcHM6IHRoZSBwb3NzaWJpbGl0eSBvZiBhc3ltbWV0cmllcyBpbiB0aGUgZW5kb3JzZW1lbnRzIG9mIHRoZXNlIGNvbmNlcHR1YWwgdW5pdHMuCgojIyMgU2NvcmluZyBlbmRvcnNlbWVudHMgb2YgY29uY2VwdHVhbCB1bml0cwoKVGhlIGZpcnN0IHN0ZXAgaW4gdGhlc2UgYW5hbHlzZXMgaXMgdG8gdHJhbnNmb3JtIHBhcnRpY2lwYW50cycgcmF0aW5ncyBvZiBpbmRpdmlkdWFsIG1lbnRhbCBjYXBhY2l0aWVzIGludG8gInNjb3JlcyIgdGhhdCBpbmRpY2F0ZSB0aGUgZXh0ZW50IHRvIHdoaWNoIHRoZXkgZW5kb3JzZWQgYSBwYXJ0aWN1bGFyIGNvbmNlcHR1YWwgdW5pdCBmb3IgdGhlIHRhcmdldCBjaGFyYWN0ZXIocykgdGhhdCB0aGV5IHdlcmUgYXNzaWduZWQgdG8gYXNzZXNzLiBUbyBkbyB0aGlzLCBJIG1ha2UgdXNlIG9mIHRoZSBFRkFzIHByZXNlbnRlZCBpbiBDaGFwdGVyIElJ4oCUd2hpY2ggb3JpZ2luYWxseSBzZXJ2ZWQgdG8gaWRlbnRpZnkgYSBzZXQgb2YgY29uY2VwdHVhbCB1bml0cyBpbiBhIHBhcnRpY3VsYXIgc2FtcGxl4oCUdG8gYSBuZXcgZW5kOiB0aGUgY29uc3RydWN0aW9uIG9mICJzY2FsZXMiIGZvciBlYWNoIG9mIHRoZXNlIGNvbmNlcHR1YWwgdW5pdHMuIFNjYWxlIGNvbnN0cnVjdGlvbiBpcyBhIGNvbW1vbiB1c2Ugb2YgRUZBIGFuZCBzaW1pbGFyIGRpbWVuc2lvbmFsaXR5IHJlZHVjdGlvbiBhbmFseXNlcyAoaWYgYW55dGhpbmcsIG1vcmUgY29tbW9uIHRoYW4gdXNpbmcgRUZBIHRvIG1ha2UgdGhlIGtpbmRzIG9mIHRoZW9yZXRpY2FsIGFyZ3VtZW50cyBmZWF0dXJlZCBpbiBDaGFwdGVyIElJKS4KCkZvciBlYWNoIEVGQSBzb2x1dGlvbiwgSSBjb25zdHJ1Y3QgYSBzY2FsZSBmb3IgZWFjaCBvZiB0aGUgZmFjdG9ycyAoY29uY2VwdHVhbCB1bml0cykgaWRlbnRpZmllZCBieSB0aGF0IHNvbHV0aW9uLiBGaXJzdCwgSSBzb3J0IGVhY2ggb2YgdGhlIG1lbnRhbCBjYXBhY2l0aWVzIGluY2x1ZGVkIGluIHRoYXQgc3R1ZHkgaW50byBjYXRlZ29yaWVzIGJhc2VkIG9uIHRoZWlyIGxvYWRpbmdzIG9uIGVhY2ggb2YgdGhlIGZhY3RvcnMgaW4gdGhhdCBzb2x1dGlvbi4gRm9yIGVhY2ggbWVudGFsIGNhcGFjaXR5LCBJIGlkZW50aWZ5IHRoZSAiZG9taW5hbnQiIGZhY3RvciBhcyB0aGUgZmFjdG9yIHdpdGggdGhlIGxhcmdlc3QgcG9zaXRpdmUgZmFjdG9yIGxvYWRpbmcuIEZvciBleGFtcGxlLCBpZiB0aGUgbWVudGFsIGNhcGFjaXR5IF9mZWVsIGhhcHB5XyBoYWQgbG9hZGluZ3Mgb2YgMC42MCBvbiB0aGUgQk9EWSBmYWN0b3IsIDAuNzAgb24gdGhlIEhFQVJUIGZhY3RvciwgYW5kIDAuMzAgb24gdGhlIE1JTkQgZmFjdG9yLCBJIHdvdWxkIHNvcnQgaXQgaW50byB0aGUgSEVBUlQgY2F0ZWdvcnkuIEZvciBlYWNoIGZhY3RvciwgSSB0YWtlIHRoZSBzaXggaGlnaGVzdC1sb2FkaW5nIGl0ZW1zIGFzIGEgY2FuZGlkYXRlIHNjYWxlLCB0aGVuICJkcm9wIiB0aGUgY2FwYWNpdGllcyB3aXRoIHRoZSBzbWFsbGVzdCBmYWN0b3IgbG9hZGluZ3Mgb24gdGhlaXIgcmVzcGVjdGl2ZSBkb21pbmFudCBmYWN0b3JzIHVudGlsIEkgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgbWVudGFsIGNhcGFjaXRpZXMgaW4gZWFjaCBjYXRlZ29yeS4gRm9yIGV4YW1wbGUsIGlmIHRoZSBCT0RZIGZhY3RvciB3ZXJlIHRoZSBkb21pbmFudCBmYWN0b3IgZm9yIG5pbmUgbWVudGFsIGNhcGFjaXRpZXMsIHRoZSBIRUFSVCBmYWN0b3IgZm9yIHNpeCBtZW50YWwgY2FwYWNpdGllcywgYW5kIHRoZSBNSU5EIGZhY3RvciBmb3IgZml2ZSBjYXBhY2l0aWVzLCBmb3IgZWFjaCBmYWN0b3IgSSB3b3VsZCBrZWVwIG9ubHkgdGhlIGNhcGFjaXRpZXMgd2l0aCB0aGUgZml2ZSBoaWdoZXN0IHBvc2l0aXZlIGxvYWRpbmdzIG9uIHRoYXQgZmFjdG9yLCBpbiBvcmRlciB0byBjb25zdHJ1Y3QgdGhyZWUgc2NhbGVzIG9mIGVxdWFsIGxlbmd0aCAoYW5kIGEgbWF4aW11bSBsZW5ndGggb2Ygc2l4IGl0ZW1zKS4KClRvIGNhbGN1bGF0ZSBzY29yZXMgb24gdGhlc2Ugc2NhbGVzLCBJIHRha2UgdGhlIGF2ZXJhZ2Ugb2YgYWxsIG9mIG1lbnRhbCBjYXBhY2l0aWVzIGZvciBlYWNoIHNjYWxlLiBUaGlzIHlpZWxkcyBhIGRhdGFzZXQgaW4gd2hpY2ggZWFjaCBwYXJ0aWNpcGFudCBpcyBhc3NvY2lhdGVkIHdpdGggb25lIHNjb3JlIGZvciBlYWNoIG9mIHRoZSBjb25jZXB0dWFsIHVuaXRzIGlkZW50aWZpZWQgaW4gdGhlIHJlbGF0aXZlIEVGQSBzb2x1dGlvbiwgZm9yIGVhY2ggb2YgdGhlIHRhcmdldCBjaGFyYWN0ZXJzIHRoYXQgdGhhdCBwYXJ0aWNpcGFudCBhc3Nlc3NlZC4KCkluIHRoaXMgY2hhcHRlciwgSSBhcHBseSB0aGlzIG1ldGhvZCB0byBhbGwgb2YgdGhlIHRocmVlLWZhY3RvciBzb2x1dGlvbnMgZm9yIGFkdWx0IHNhbXBsZXMgYXMgcHJlc2VudGVkIGluIENoYXB0ZXIgSUkgKFN0dWRpZXMgMS00KSwgeWllbGRpbmcgQk9EWSwgSEVBUlQsIGFuZCBNSU5EIHNjb3JlcyBmb3IgZWFjaCB0YXJnZXQgY2hhcmFjdGVyIGFzIGFzc2Vzc2VkIGJ5IGVhY2ggcGFydGljaXBhbnQuIChJIGlnbm9yZSB0aGUgYWJlcnJhbnQgZm91ci1mYWN0b3Igc29sdXRpb24gZm9yIGFkdWx0cyBpbiBTdHVkeSAyIHN1Z2dlc3RlZCBieSBvbmUgb2YgdGhlIHRocmVlIGZhY3RvciByZXRlbnRpb24gcHJvdG9jb2xzIGNvbnNpZGVyZWQgaW4gdGhhdCBjaGFwdGVyLCBzaW5jZSB0aGlzIHdhcyB0aGUgb25seSBzdHVkeSBvdXQgb2YgdGhlIHNldmVuIGNvbnNpZGVyZWQgaW4gd2hpY2ggYSBmb3VyLWZhY3RvciBzb2x1dGlvbiBhcHBlYXJlZCB0byBhZGQgYW55IHZhbHVlIGJleW9uZCB0aGUgcm9idXN0IEJPRFktSEVBUlQtTUlORCBmcmFtZXdvcmsgY29tbW9uIHRvIGFsbCBzdHVkaWVzLiBbWFggQVBQRU5ESVggQj9dKQoKRm9yIGNoaWxkIHNhbXBsZXMsIEkgYXBwbHkgdGhpcyBtZXRob2QgYm90aCB0byB0aGUgc29sdXRpb25zIGVtZXJnaW5nIGZyb20gY2hpbGRyZW4ncyBvd24gZGF0YSBhbmQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgX2FkdWx0XyBzb2x1dGlvbnMgZm9yIHRoZSBzdHVkaWVzIGluIHF1ZXN0aW9uLiBUaGlzIGFsbG93cyBtZSB0byBleHBsb3JlIGJvdGggdGhlIHJlbGF0aW9uc2hpcHMgYW1vbmcgY2hpbGRyZW4ncyBvd24gY29uY2VwdHVhbCB1bml0cywgYW5kIHRoZSByZWxhdGlvbnNoaXBzIGFtb25nIGEgZnVsbHkgYWR1bHQtbGlrZSBzZXQgb2YgY29uY2VwdHVhbCB1bml0cyAocHJlc3VtYWJseSwgdGhlIGNvbmNlcHR1YWwgdW5pdHMgdGhhdCB0aGVzZSBjaGlsZHJlbiB3aWxsIGV2ZW50dWFsbHkgY29tZSB0byBhZ3JlZSBvbiBhcyB0aGV5IG1hdHVyZSBpbnRvIGFkdWx0cykuIAoKRm9yICJvbGRlciIgY2hpbGRyZW4gKDctOXkgb2YgYWdlOyBTdHVkaWVzIDIgYW5kIDMpLCB0aGlzIG1lYW5zIGV4YW1pbmluZyB0d28gc2V0cyBvZiB0aHJlZSBjb25jZXB0dWFsIHVuaXRzIGZvciBlYWNoIHNhbXBsZSBvZiBjaGlsZHJlbjogKDEpIEJPRFksIEhFQVJULCBhbmQgTUlORCBhcyBkZWZpbmVkIGJ5IGFkdWx0cyBpbiB0aGF0IHN0dWR5OyBhbmQgKDIpIEJPRFksIEhFQVJULCBhbmQgTUlORCBhcyBkZWZpbmVkIGJ5IHRoZSBjaGlsZHJlbiB0aGVtc2VsdmVzLiBCZWNhdXNlIHRoZSBFRkFzIGZvciBvbGRlciBjaGlsZHJlbiBhbmQgYWR1bHRzIGFyZSBzbyBzaW1pbGFyIChzZWUgQ2hhcHRlciBJSSksIEkgZXhwZWN0IHRoZSBvdXRjb21lcyBvZiB0aGVzZSB0d28gYXBwcm9hY2hlcyB0byBjb25zdHJ1Y3RpbmcgQk9EWSwgSEVBUlQsIGFuZCBNSU5EIHNjYWxlcyB0byB5aWVsZCB2ZXJ5IHNpbWlsYXIgcmVzdWx0cyBpbiB0aGlzIGFnZSBncm91cC4KCkZvciAieW91bmdlciIgY2hpbGRyZW4sIHRoaXMgbWVhbnMgZXhhbWluaW5nIG11bHRpcGxlIHNldHMgb2YgY29uY2VwdHVhbCB1bml0cyBmb3IgZWFjaCBzYW1wbGUgb2YgY2hpbGRyZW4sIGluY2x1ZGluZyAoMSkgQk9EWSwgSEVBUlQsIGFuZCBNSU5EIGFzIGRlZmluZWQgYnkgYWR1bHRzIGluIHRoYXQgc3R1ZHk7IGFuZCAoMikgdmFyeWluZyBzZXRzIG9mIDItNCBjb25jZXB0dWFsIHVuaXRzIGFzIGRlZmluZWQgYnkgRUZBIG9mIGNoaWxkcmVuJ3Mgb3duIHJlc3BvbnNlcywgdXNpbmcgZGlmZmVyZW50IGZhY3RvciByZXRlbnRpb24gcHJvdG9jb2xzLiBUaGUgRUZBcyBvZiB5b3VuZ2VyIGNoaWxkcmVuJ3MgcmVzcG9uc2VzICB3ZXJlIGxlc3MgcmVsaWFibGUsIGFuZCBsZXNzIGFkdWx0LWxpa2UsIHRoYW4gdGhvc2Ugb2Ygb2xkZXIgY2hpbGRyZW4uIEFzIGEgY29uc2VxdWVuY2UsIEkgZXhwZWN0IHRoZSBvdXRjb21lcyBvZiB0aGVzZSBkaWZmZXJlbnQgYXBwcm9hY2hlcyB0byBjb25zdHJ1Y3Rpbmcgc2NhbGVzIGZvciBlYWNoIGNvbmNlcHR1YWwgdW5pdCB0byB5aWVsZCByYXRoZXIgZGlmZmVyZW50IHJlc3VsdHMgaW4gdGhpcyBhZ2UgZ3JvdXAuCgpUaGUgcmVhZGVyIHNob3VsZCBub3RlIHRoYXQgdGhpcyBpcyBmYXIgZnJvbSB0aGUgb25seSB3YXkgdG8gYXBwcm9hY2ggInNjb3JpbmciIHBhcnRpY2lwYW50cyBvbiB0aGVzZSBjb25jZXB0dWFsIHVuaXRzLiBJbiBwYXJ0aWN1bGFyLCBJIGNvdWxkIGhhdmUgZXhhbWluZWQgZmFjdG9yIHNjb3Jlc+KAlHN1bW1hcmllcyBvZiBlYWNoIGZhY3RvciAoY29uY2VwdHVhbCB1bml0KSBiYXNlZCBvbiBhIHBhcnRpY2lwYW50J3MgcmVzcG9uc2VzIHRvIGFsbCBtZW50YWwgY2FwYWNpdGllcyBhbmQgdGhlIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiBhbGwgbWVudGFsIGNhcGFjaXRpZXMgYW5kIGFsbCBmYWN0b3JzIGluY2x1ZGVkIGluIHRoYXQgRUZBIHNvbHV0aW9u4oCUcmF0aGVyIHRoYW4gY29uc3RydWN0aW5nICJzY2FsZXMiIGluIHRoZSB3YXkgSSBoYXZlIGp1c3Qgb3V0bGluZWQuIEhvd2V2ZXIsIG11Y2ggbGlrZSBfel8tc2NvcmVzLCBmYWN0b3Igc2NvcmVzIGluZGljYXRlIHdoZXJlIGEgcGFydGljaXBhbnQgZmFsbHMgaW4gcmVsYXRpb24gdG8gb3RoZXIgcGFydGljaXBhbnRzIGluIHRoZSBzYW1wbGUsIGFuZCBkbyBub3QgcHJvdmlkZSB0aGUga2luZCBvZiBhYnNvbHV0ZSBzY29yZSB0aGF0IGlzIGtleSB0byBteSBnb2FsIGluIHRoaXMgY2hhcHRlciwgd2hpY2ggaXMgdG8gYW5hbHl6ZSByZWxhdGlvbnNoaXBzIGFtb25nIGZhY3RvcnMgaW4gdGVybXMgb2YgdGhlIGV4dGVudCB0byB3aGljaCBpbmRpdmlkdWFsIHBhcnRpY2lwYW50cyBpbmRpY2F0ZWQgdGhhdCB0YXJnZXQgY2hhcmFjdGVycyAicG9zc2Vzc2VkIiB0aGUgY29uY2VwdHVhbCB1bml0cyBCT0RZLCBIRUFSVCwgYW5kIE1JTkQuIFtYWCBBUFBFTkRJWCBCP10KCkV2ZW4gd2l0aGluIHRoZSAic2NhbGUiIGFwcHJvYWNoIGRlc2NyaWJlZCBpbiB0aGlzIHNlY3Rpb24sIHRoZXJlIGFyZSBtYW55IHBhcmFtZXRlcnMgb2YgdGhpcyBhbmFseXNpcyB0aGF0IEkgY291bGQgaGF2ZSBzZXQgZGlmZmVyZW50bHkuIEZvciBleGFtcGxlLCBJIGNvdWxkIGhhdmUgY29uc2lkZXJlZCBhYnNvbHV0ZSBmYWN0b3IgbG9hZGluZ3MgcmF0aGVyIHRoYW4gcmF3IGZhY3RvciBsb2FkaW5ncywgd2hpY2ggd291bGQgYWxsb3cgZm9yIG1lbnRhbCBjYXBhY2l0aWVzIHRoYXQgbG9hZGVkIGVzcGVjaWFsbHkgc3Ryb25nbHkgX25lZ2F0aXZlbHlfIG9uIGEgcGFydGljdWxhciBmYWN0b3IgdG8gY29udHJpYnV0ZSAobmVnYXRpdmVseSkgdG8gc2NvcmVzIG9uIHRoYXQgY29uY2VwdHVhbCB1bml0OyBJIGNvdWxkIGhhdmUgb21pdHRlZCB0aGUgc3RlcCBvZiBtYWtpbmcgdGhlIHNjYWxlcyBmb3IgYWxsIGZhY3RvcnMgd2l0aGluIGEgc2luZ2xlIEVGQSBzb3RsdWlvbiBlcXVhbCBsZW5ndGg7IEkgY291bGQgaGF2ZSBjaG9zZW4gdG8gdXNlIG9ubHkgdGhlIHRvcCA0IG9yIDUgbWVudGFsIGNhcGFjaXRpZXMgYWNyb3NzIGFsbCBFRkEgc29sdXRpb25zLCBvciB0byBzZXQgbm8gbGltaXQgb24gdGhlIG51bWJlciBvZiBpdGVtcyBpbiBhIHNjYWxlOyBvciBJIGNvdWxkIGhhdmUgaW1wbGVtZW50ZWQgYWJzb2x1dGUgdGhyZXNob2xkcyBmb3IgaG93IHN0cm9uZ2x5IGEgbWVudGFsIGNhcGFjaXR5IG11c3QgbG9hZCBvbiBhIGZhY3RvciBpbiBvcmRlciB0byBjb3VudCB0b3dhcmQgdGhlIHNjb3JlIGZvciB0aGF0IGNvbmNlcHR1YWwgdW5pdCwgb3IgYWJzb2x1dGUgbGltaXRzIG9uIHRoZSBkZWdyZWUgdG8gd2hpY2ggYSBtZW50YWwgY2FwYWNpdHkgY2FuICJjcm9zcy1sb2FkIiBvbiBub24tZG9taW5hbnQgZmFjdG9ycyBhbmQgc3RpbGwgY291bnQgdG93YXJkIHRoZSBzY29yZSBmb3IgYW55IG9uZSBjb25jZXB0dWFsIHVuaXQuIFtYWCBBUFBFTkRJWCBCP10gSG93ZXZlciwgdGhlc2Uga2luZHMgb2YgZGV0YWlscyBkaWZmZXIgcXVpdGUgZHJhbWF0aWNhbGx5IGFjcm9zcyBzdHVkaWVzIGFuZCBhZ2UgZ3JvdXBzLiBGb3IgZXhhbXBsZSwgaW4gc29tZSBzYW1wbGVzIHRoZXJlIGFyZSBubyBzdHJvbmcgbmVnYXRpdmUgZmFjdG9yIGxvYWRpbmdzLCBhbmQgaW4gb3RoZXJzIHRoZXJlIGFyZTsgaWYgSSBjb25zaWRlcmVkIGFic29sdXRlIGxvYWRpbmdzIHJhdGhlciB0aGFuIHJhdyBsb2FkaW5ncywgSSBjb3VsZCBlbmQgdXAgY29tcGFyaW5nIHNjb3JlcyBmcm9tIGEgImJpcG9sYXIiIHNjYWxlIGluIG9uZSBzYW1wbGUgdG8gc2NvcmVzIGZyb20gYSAidW5pcG9sYXIiIHNjYWxlcyBpbiBhbm90aGVyIHNhbXBsZSwgbWFraW5nIHRoZSBjb21wYXJpc29uIG1vcmUgZGlmZmljdWx0IHRvIGludGVycHJldC4gTGlrZXdpc2UsIHNvbWUgRUZBIHNvbHV0aW9ucyB0ZW5kZWQgdG8gZmVhdHVyZSBnZW5lcmFsbHkgd2Vha2VyIGZhY3RvciBsb2FkaW5ncyB0aGFuIG90aGVyczsgaWYgSSB3ZXJlIHRvIGltcG9zZSBhYnNvbHV0ZSB0aHJlc2hvbGRzIGZvciB0aGUgc3RyZW5ndGggb2YgZmFjdG9yIGxvYWRpbmdzLCBJIGNvdWxkIGVuZCB1cCBjb21wYXJpbmcgc2NvcmVzIGZyb20gc2NhbGVzIG9mIHdpbGRseSBkaWZmZXJlbnQgbGVuZ3RocyBhY3Jvc3Mgc2FtcGxlcy4gSW4gbXkgdmlldywgdGhlIGFuYWx5c2lzIGRlY2lzaW9ucyBvdXRsaW5lZCBhYm92ZSBtYXhpbWl6ZSBjb21wYXJhYmlsaXR5IGFjcm9zcyBzdHVkaWVzIGFuZCBhZ2UgZ3JvdXBz4oCUdGhlIHByaW1hcnkgZ29hbCBvZiB0aGlzIGNoYXB0ZXIuIChOb3RlLCBob3dldmVyLCB0aGF0IGluIHRoZSBhbmFseXNpcyBjb2RlIGZvciB0aGlzIGNoYXB0ZXIgSSBoYXZlIGluY2x1ZGVkIGVhc3kgc2hvcnQgY3V0cyBmb3IgdGhlIGludGVyZXN0ZWQgcmVhZGVyIHRvIGV4cGxvcmUgZGlmZmVyZW50IG9wdGlvbnMgZm9yIGVhY2ggb2YgdGhlc2UgcGFyYW1ldGVycy4pCgpgYGB7cn0KIyBzZWUgIi4vc2NyaXB0cy9vcmdfcGFyYW0uUiIgZm9yIHBhcmFtZXRlciBzZXR0aW5nCmBgYAoKIyMjIFZpc3VhbGl6aW5nIHJlbGF0aW9uc2hpcHMKClhYCgpvdXRsaW5lOgoKLSBmb3IgYW55IHNhbXBsZSwgSSBoYXZlIGlkZW50aWZpZWQgcmVsZXZhbnQgY29uY2VwdHVhbCB1bml0cyAoY2hhcHRlciBJSSkgYW5kIHNjb3JlZCBlYWNoIHBhcnRpY2lwYW50J3MgZW5kb3JzZW1lbnQgb2YgZWFjaCBvZiB0aGVzZSB1bml0cyBmb3IgdGhlaXIgYXNzaWduZWQgdGFyZ2V0IGNoYXJhY3RlcihzKSAocHJldmlvdXMgc2VjdGlvbikKLSBub3csIEkgd2FudCB0byBhc3Nlc3MgdGhlIHJlbGF0aW9uc2hpcHMgYW1vbmcgdGhlc2UgZW5kb3JzZW1lbnRzIAotIGJ1dCBJIGRvbid0IHJlYWxseSBrbm93IHdoYXQgdG8gZXhwZWN0LCBhbmQgdGhlc2UgcmVsYXRpb25zaGlwcyBjb3VsZCBiZSB2ZXJ5IGNvbXBsZXgKLSBzbywgc3RhcnQgd2l0aCBob2xpc3RpYywgZXhwbG9yYXRvcnkgdmlzdWFsaXphdGlvbjogc2NhdHRlcnBsb3RzIG9mIHBhaXJzIG9mIGNvbmNlcHR1YWwgdW5pdHMKCgojIyMgVGFyZ2V0aW5nIHRoZSBwb3NzaWJpbGl0eSBvZiBhc3ltbWV0cmllcwoKWFgKCm91dGxpbmU6CgotIG5vdywgYSBtb3JlIHRhcmdldGVkIGFwcHJvYWNoIHRvIG9uZSBwYXJ0aWN1bGFyIGFzcGVjdCBvZiB0aGVzZSByZWxhdGlvbnNoaXBzOiBhc3ltbWV0cmllcwotIHJlbWluZGVyIG9mIGJhc2ljIGludHVpdGlvbjogaW4gdGhpcyBzYW1wbGUsIGRvIHBhcnRpY2lwYW50cyB0ZW5kIHRvIGVuZG9yc2UgQSB3aXRob3V0IEI/IEIgd2l0aG91dCBBPyBpcyB0aGVyZSBhbiBhc3ltbWV0cnkgaGVyZT8KLSBjb25uZWN0IHRvIHRoZSB2aXN1YWxpemF0aW9uczogYXN5bW1ldHJpZXMgb2YgcG9pbnRzIGFyb3VuZCB0aGUgeT14IGxpbmUgb2YgZXF1aXZhbGVuY2UKLSBvbmUgd2F5IHRvIGJvaWwgdGhpcyBkb3duIHRvIGEgbnVtYmVyOiBkaWZmZXJlbmNlIHNjb3JlcyAoZm9yIGVhY2ggcGFpciksIGNvbXBhcmlzb25zIHRvIDAgdmlhIGJheWVzaWFuIHJlZ3Jlc3Npb25zCi0gZm9yIGFueSBwYWlyOiBpZiAwLCBubyBldmlkZW5jZSBmb3IgaGllcmFyY2h5LiBpZiBub24temVybywgc29tZSBldmlkZW5jZS4KLSBjb21wYXJpc29ucyBhY3Jvc3MgcGFpcnM6IGZ1cnRoZXIgZnJvbSAwLCBtb3JlIGhpZXJhcmNoaWNhbC4KLSBjYXZlYXQgMTogdGhlc2UgYXJlIHBvc3QtaG9jIGFuYWx5c2VzISBidXQgc3RpbGwgdXNpbmcgY29uZmlybWF0b3J5IHN0YXRzLiAKLSBjYXZlYXQgMjogc2NvcmVzIG9mICgwLDApIHRyZWF0ZWQgc2FtZSBhcyBzY29yZXMgb2YgKDYsNiksIG9yIGFueXdoZXJlIGluIGJldHdlZW4uCgoKIyBTdHVkeSAxOiBBbiBhZHVsdCBlbmRwb2ludAoKSW4gdGhlIGNvbnRleHQgb2YgdGhpcyBkaXNzZXJ0YXRpb24sIFN0dWR5IDEgc2VydmVzIHRoZSByb2xlIG9mIGRlc2NyaWJpbmcgYSBkZXZlbG9wbWVudGFsIGVuZHBvaW50IGZvciBjb25jZXB0dWFsIHJlcHJlc2VudGF0aW9ucyBvZiBtZW50YWwgbGlmZS4gSW4gdGhpcyBjaGFwdGVyLCBJIGZvY3VzIG9uIHdoYXQgdGhlc2Ugc3R1ZGllcyBjYW4gcmV2ZWFsIGFib3V0IHRoZSByZWxhdGlvbnNoaXBzIGFtb25nIHRoZSBjb25jZXB0dWFsIHVuaXRzIGRpc2N1c3NlZCBpbiBDaGFwdGVyIElJSS4gVGhlc2UgYW5hbHlzZXMgd2VyZSBub3QgcGFydCBvZiB0aGUgb3JpZ2luYWwgcHVibGljYXRpb24gb2YgdGhlc2Ugc3R1ZGllcyAoV2Vpc21hbiBldCBhbC4sIDIwMTcpLgoKIyMgU3BlY2lhbCBub3RlcyBvbiBkYXRhIHByb2Nlc3NpbmcgYW5kIGFuYWx5c2lzCgpBcyBub3RlZCBpbiBDaGFwdGVyIElJLCBpbiB0aGUgb3JpZ2luYWwgYW5hbHlzaXMgb2YgdGhlc2UgZGF0YXNldHMgcmVzcG9uc2VzIHdlcmUgcmVjb2RlZCB0byBydW4gZnJvbSAtMyB0byArMyBiZWZvcmUgYW5hbHlzZXMgKFdlaXNtYW4gZXQgYWwuLCAyMDE3KTsgaW4gdGhpcyBkaXNzZXJ0YXRpb24sIEkgbWFpbnRhaW4gdGhlIDAtNiBjb2RpbmcgZm9yIGNvbXBhcmFiaWxpdHkgdG8gU3R1ZGllcyAyLTQuCgojIyBSZXN1bHRzCgojIyMgU3R1ZHkgMWEKCkluIFN0dWR5IDFhLCBgciBucm93KGQxYV9hZF93aWRlKWAgVVMgYWR1bHRzIGVhY2ggYXNzZXNzZWQgYSBzaW5nbGUgdGFyZ2V0IGNoYXJhY3RlciBvbiA0MCBtZW50YWwgY2FwYWNpdGllcy4gVGhpcyBzdHVkeSBlbXBsb3llZCB0aGUgImVkZ2UgY2FzZSIgdmFyaWFudCBvZiB0aGUgZ2VuZXJhbCBhcHByb2FjaCwgd2l0aCBwYXJ0aWNpcGFudHMgcmFuZG9tbHkgYXNzaWduZWQgdG8gYXNzZXNzIGVpdGhlciBhIGJlZXRsZSBvciBhIHJvYm90LiAoU2VlIENoYXB0ZXIgSUkgYW5kIFdlaXNtYW4gZXQgYWwuLCAyMDE3LCBmb3IgZGV0YWlsZWQgbWV0aG9kcy4pCgojIyMjIFNjYWxlIGNvbnN0cnVjdGlvbgoKYGBge3J9CnNjYWxlc19lZmFfd2RtX2QxYV9hZCA8LSBzY2FsZV9mdW4oZWZhX3dkbV9kMWFfYWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9uYW1lcyA9IGZhY3Rvcl9uYW1lc19lZmFfd2RtX2QxYV9hZCkKZDFhX2FkX3Njb3JlZF9hZCA8LSBzY29yZV9mdW4oZDFhX2FkLCBzY2FsZXNfZWZhX3dkbV9kMWFfYWQpCgpzYXZlUkRTKHNjYWxlc19lZmFfd2RtX2QxYV9hZCwgZmlsZSA9ICIuL3NjYWxlcy9zY2FsZXNfZWZhX3dkbV9kMWFfYWQiKQpzYXZlUkRTKGQxYV9hZF9zY29yZWRfYWQsIGZpbGUgPSAiLi9zY29yZWRfZGF0YS9kMWFfYWRfc2NvcmVkX2FkIikKYGBgCgpGb2xsb3dpbmcgdGhlIHN0ZXBzIGRlc2NyaWJlZCBpbiAiR2VuZXJhbCBhbmFseXNpcyBwbGFuLCIgYWJvdmUsIHlpZWxkZWQgYHIgZmFjdF9uYW1lX2Z1bihmYWN0b3JfbmFtZXNfZWZhX3dkbV9kMWFfYWQpYCBzY2FsZXMgb2YgYHIgc2NhbGVzX2VmYV93ZG1fZDFhX2FkICU+JSBjb3VudChmYWN0b3IpICU+JSBzdW1tYXJpc2UobWVhbiA9IG1lYW4obikpICU+JSBzZWxlY3QobWVhbikgJT4lIGFzLm51bWVyaWMoKWAgaXRlbXMgZWFjaDsgc2VlIFRhYmxlIDQuMS4KCiMjIyMgVmlzdWFsaXphdGlvbgoKWFgKCmBgYHtyfQpwbG90c19kMWFfYWRfc2NvcmVkX2FkIDwtIHJlbHZpel9mdW4oZDFhX2FkX3Njb3JlZF9hZCkKYGBgCgpgYGB7cn0KZmlnX2QxYV9hZF9wbG90cyA8LSBwbG90X2dyaWQocGxvdHNfZDFhX2FkX3Njb3JlZF9hZFtbMV1dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdHNfZDFhX2FkX3Njb3JlZF9hZFtbMl1dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdHNfZDFhX2FkX3Njb3JlZF9hZFtbM11dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQTEiLCAiQTIiLCAiQTMiKSwgbmNvbCA9IDMpCgpmaWdfZDFhX2FkX2xlZyA8LSBnZXRfbGVnZW5kKAogIHBsb3RzX2QxYV9hZF9zY29yZWRfYWRbWzFdXSArCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikgKwogICAgc2NhbGVfZmlsbF9tYW51YWwoIlRhcmdldCBjaGFyYWN0ZXIiLCB2YWx1ZXMgPSBjb2xvcnMwMiwKICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKHRpdGxlLnBvc2l0aW9uID0gImxlZnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gImhvcml6b250YWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDIpKSArCiAgICBzY2FsZV9jb2xvcl9tYW51YWwoIlRhcmdldCBjaGFyYWN0ZXIiLCB2YWx1ZXMgPSBjb2xvcnMwMiwKICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZCh0aXRsZS5wb3NpdGlvbiA9ICJsZWZ0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDIpKSkKCmZpZ19kMWFfYWRfcGxvdHNfbGVnIDwtIHBsb3RfZ3JpZChmaWdfZDFhX2FkX3Bsb3RzLCBmaWdfZDFhX2FkX2xlZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMSwgMC4wNSkpCgpmaWdfZDFhX2FkX3RpdGxlIDwtIGdnZHJhdygpICsgCiAgZHJhd19sYWJlbCgiU3R1ZHkgMWE6IEFkdWx0cyIsIHNpemUgPSAxNiwgZm9udGZhY2UgPSAnYm9sZCcsIHggPSAwLCBoanVzdCA9IDApCgpmaWdfZDFhX2FkX3Bsb3RzX2xlZ190aXRsZSA8LSBwbG90X2dyaWQoZmlnX2QxYV9hZF90aXRsZSwgZmlnX2QxYV9hZF9wbG90c19sZWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDAuMTIsIDEpKQpgYGAKCiMjIyMgQW5hbHlzaXMgb2YgYXN5bW1ldHJpZXMKClhYCgpgYGB7cn0KZDFhX2FkX3Njb3JlZF9hZF9kaWZmIDwtIGRpZmZfZnVuKGQxYV9hZF9zY29yZWRfYWQpCnNhdmVSRFMoZDFhX2FkX3Njb3JlZF9hZF9kaWZmLCAiLi9kaWZmc2NvcmVfZGF0YS9kMWFfYWRfc2NvcmVkX2FkX2RpZmYiKQpgYGAKCmBgYHtyfQpwbG90X2QxYV9hZF9zY29yZWRfYWRfZGlmZiA8LSBkaWZmcGxvdF9mdW4oZDFhX2FkX3Njb3JlZF9hZF9kaWZmKQpgYGAKCmBgYHtyfQojIHJfZDFhX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyAoMSB8IGNoYXJhY3RlciksCiMgICBkYXRhID0gZDFhX2FkX3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIEhFQVJUIiksCiMgICBjb250cmFzdHMgPSBsaXN0KGNoYXJhY3RlciA9IGNvbnRyYXN0c19zdW1fZWRnZSksCiMgICBjb3JlcyA9IDQsIGNvbnRyb2wgPSBsaXN0KGFkYXB0X2RlbHRhID0gMC45OTkpKQoKIyByX2QxYV9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUIDwtIGxtZXIoCiMgICBkaWZmIH4gMSArICgxIHwgY2hhcmFjdGVyKSwKIyAgIGRhdGEgPSBkMWFfYWRfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gSEVBUlQiKSwKIyAgIGNvbnRyYXN0cyA9IGxpc3QoY2hhcmFjdGVyID0gY29udHJhc3RzX3N1bV9lZGdlKSkKCnJfZDFhX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQgPC0gbG0oCiAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIsCiAgZGF0YSA9IGQxYV9hZF9zY29yZWRfYWRfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFkgLSBIRUFSVCIpLAogIGNvbnRyYXN0cyA9IGxpc3QoY2hhcmFjdGVyID0gY29udHJhc3RzX3N1bV9lZGdlKSkKCiMgcl9kMWFfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCA8LSBsbSgKIyAgIGRpZmYgfiAxLAojICAgZGF0YSA9IGQxYV9hZF9zY29yZWRfYWRfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFkgLSBIRUFSVCIpKQoKc3VtbWFyeShyX2QxYV9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUKQpgYGAKCmBgYHtyfQojIHJfZDFhX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCA8LSBicm0oCiMgICBkaWZmIH4gMSArICgxIHwgY2hhcmFjdGVyKSwKIyAgIGRhdGEgPSBkMWFfYWRfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gTUlORCIpLAojICAgY29udHJhc3RzID0gbGlzdChjaGFyYWN0ZXIgPSBjb250cmFzdHNfc3VtX2VkZ2UpLAojICAgY29yZXMgPSA0LCBjb250cm9sID0gbGlzdChhZGFwdF9kZWx0YSA9IDAuOTk5KSkKCiMgcl9kMWFfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIDwtIGxtZXIoCiMgICBkaWZmIH4gMSArICgxIHwgY2hhcmFjdGVyKSwKIyAgIGRhdGEgPSBkMWFfYWRfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gTUlORCIpLAojICAgY29udHJhc3RzID0gbGlzdChjaGFyYWN0ZXIgPSBjb250cmFzdHNfc3VtX2VkZ2UpKQoKcl9kMWFfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIDwtIGxtKAogIGRpZmYgfiAxICsgY2hhcmFjdGVyLAogIGRhdGEgPSBkMWFfYWRfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gTUlORCIpLAogIGNvbnRyYXN0cyA9IGxpc3QoY2hhcmFjdGVyID0gY29udHJhc3RzX3N1bV9lZGdlKSkKCiMgcl9kMWFfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIDwtIGxtKAojICAgZGlmZiB+IDEsCiMgICBkYXRhID0gZDFhX2FkX3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIE1JTkQiKSkKCnN1bW1hcnkocl9kMWFfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EKQpgYGAKCmBgYHtyfQojIHJfZDFhX2FkX3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyAoMSB8IGNoYXJhY3RlciksCiMgICBkYXRhID0gZDFhX2FkX3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiSEVBUlQgLSBNSU5EIiksCiMgICBjb250cmFzdHMgPSBsaXN0KGNoYXJhY3RlciA9IGNvbnRyYXN0c19zdW1fZWRnZSksCiMgICBjb3JlcyA9IDQsIGNvbnRyb2wgPSBsaXN0KGFkYXB0X2RlbHRhID0gMC45OTkpKQoKIyByX2QxYV9hZF9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EIDwtIGxtZXIoCiMgICBkaWZmIH4gMSArICgxIHwgY2hhcmFjdGVyKSwKIyAgIGRhdGEgPSBkMWFfYWRfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJIRUFSVCAtIE1JTkQiKSwKIyAgIGNvbnRyYXN0cyA9IGxpc3QoY2hhcmFjdGVyID0gY29udHJhc3RzX3N1bV9lZGdlKSkKCnJfZDFhX2FkX3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQgPC0gbG0oCiAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIsCiAgZGF0YSA9IGQxYV9hZF9zY29yZWRfYWRfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkhFQVJUIC0gTUlORCIpLAogIGNvbnRyYXN0cyA9IGxpc3QoY2hhcmFjdGVyID0gY29udHJhc3RzX3N1bV9lZGdlKSkKCiMgcl9kMWFfYWRfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCA8LSBsbSgKIyAgIGRpZmYgfiAxLAojICAgZGF0YSA9IGQxYV9hZF9zY29yZWRfYWRfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkhFQVJUIC0gTUlORCIpKQoKc3VtbWFyeShyX2QxYV9hZF9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EKQpgYGAKCiMjIyBTdHVkeSAxYgoKU3R1ZHkgMWIgd2FzIGEgZGlyZWN0IHJlcGxpY2F0aW9uIG9mIFN0dWR5IDFhOiBgciBucm93KGQxYl9hZF93aWRlKWAgVVMgYWR1bHRzIGVhY2ggYXNzZXNzZWQgYSBzaW5nbGUgdGFyZ2V0IGNoYXJhY3RlciAoZWl0aGVyIGEgYmVldGxlIG9yIGEgcm9ib3QpIG9uIDQwIG1lbnRhbCBjYXBhY2l0aWVzLiAoU2VlIENoYXB0ZXIgSUkgYW5kIFdlaXNtYW4gZXQgYWwuLCAyMDE3LCBmb3IgZGV0YWlsZWQgbWV0aG9kcy4pCgojIyMjIFNjYWxlIGNvbnN0cnVjdGlvbgoKYGBge3J9CnNjYWxlc19lZmFfd2RtX2QxYl9hZCA8LSBzY2FsZV9mdW4oZWZhX3dkbV9kMWJfYWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9uYW1lcyA9IGZhY3Rvcl9uYW1lc19lZmFfd2RtX2QxYl9hZCkKZDFiX2FkX3Njb3JlZF9hZCA8LSBzY29yZV9mdW4oZDFiX2FkLCBzY2FsZXNfZWZhX3dkbV9kMWJfYWQpCgpzYXZlUkRTKHNjYWxlc19lZmFfd2RtX2QxYl9hZCwgZmlsZSA9ICIuL3NjYWxlcy9zY2FsZXNfZWZhX3dkbV9kMWJfYWQiKQpzYXZlUkRTKGQxYl9hZF9zY29yZWRfYWQsIGZpbGUgPSAiLi9zY29yZWRfZGF0YS9kMWJfYWRfc2NvcmVkX2FkIikKYGBgCgpGb2xsb3dpbmcgdGhlIHN0ZXBzIGRlc2NyaWJlZCBpbiAiR2VuZXJhbCBhbmFseXNpcyBwbGFuLCIgYWJvdmUsIHlpZWxkZWQgYHIgZmFjdF9uYW1lX2Z1bihmYWN0b3JfbmFtZXNfZWZhX3dkbV9kMWJfYWQpYCBzY2FsZXMgb2YgYHIgc2NhbGVzX2VmYV93ZG1fZDFiX2FkICU+JSBjb3VudChmYWN0b3IpICU+JSBzdW1tYXJpc2UobWVhbiA9IG1lYW4obikpICU+JSBzZWxlY3QobWVhbikgJT4lIGFzLm51bWVyaWMoKWAgaXRlbXMgZWFjaDsgc2VlIFRhYmxlIDQuMS4KCiMjIyMgVmlzdWFsaXphdGlvbgoKWFgKCmBgYHtyfQpwbG90c19kMWJfYWRfc2NvcmVkX2FkIDwtIHJlbHZpel9mdW4oZDFiX2FkX3Njb3JlZF9hZCkKYGBgCgpgYGB7cn0KZmlnX2QxYl9hZF9wbG90cyA8LSBwbG90X2dyaWQocGxvdHNfZDFiX2FkX3Njb3JlZF9hZFtbMV1dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdHNfZDFiX2FkX3Njb3JlZF9hZFtbMl1dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdHNfZDFiX2FkX3Njb3JlZF9hZFtbM11dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQjEiLCAiQjIiLCAiQjMiKSwgbmNvbCA9IDMpCgpmaWdfZDFiX2FkX2xlZyA8LSBnZXRfbGVnZW5kKAogIHBsb3RzX2QxYl9hZF9zY29yZWRfYWRbWzFdXSArCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikgKwogICAgc2NhbGVfZmlsbF9tYW51YWwoIlRhcmdldCBjaGFyYWN0ZXIiLCB2YWx1ZXMgPSBjb2xvcnMwMiwKICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKHRpdGxlLnBvc2l0aW9uID0gImxlZnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gImhvcml6b250YWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDIpKSArCiAgICBzY2FsZV9jb2xvcl9tYW51YWwoIlRhcmdldCBjaGFyYWN0ZXIiLCB2YWx1ZXMgPSBjb2xvcnMwMiwKICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZCh0aXRsZS5wb3NpdGlvbiA9ICJsZWZ0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDIpKSkKCmZpZ19kMWJfYWRfcGxvdHNfbGVnIDwtIHBsb3RfZ3JpZChmaWdfZDFiX2FkX3Bsb3RzLCBmaWdfZDFiX2FkX2xlZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMSwgMC4wNSkpCgpmaWdfZDFiX2FkX3RpdGxlIDwtIGdnZHJhdygpICsgCiAgZHJhd19sYWJlbCgiU3R1ZHkgMWI6IEFkdWx0cyIsIHNpemUgPSAxNiwgZm9udGZhY2UgPSAnYm9sZCcsIHggPSAwLCBoanVzdCA9IDApCgpmaWdfZDFiX2FkX3Bsb3RzX2xlZ190aXRsZSA8LSBwbG90X2dyaWQoZmlnX2QxYl9hZF90aXRsZSwgZmlnX2QxYl9hZF9wbG90c19sZWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDAuMTIsIDEpKQpgYGAKCiMjIyMgQW5hbHlzaXMgb2YgYXN5bW1ldHJpZXMKClhYCgpgYGB7cn0KZDFiX2FkX3Njb3JlZF9hZF9kaWZmIDwtIGRpZmZfZnVuKGQxYl9hZF9zY29yZWRfYWQpCnNhdmVSRFMoZDFiX2FkX3Njb3JlZF9hZF9kaWZmLCAiLi9kaWZmc2NvcmVfZGF0YS9kMWJfYWRfc2NvcmVkX2FkX2RpZmYiKQpgYGAKCmBgYHtyfQpwbG90X2QxYl9hZF9zY29yZWRfYWRfZGlmZiA8LSBkaWZmcGxvdF9mdW4oZDFiX2FkX3Njb3JlZF9hZF9kaWZmKQpgYGAKCmBgYHtyfQojIHJfZDFiX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyAoMSB8IGNoYXJhY3RlciksCiMgICBkYXRhID0gZDFiX2FkX3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIEhFQVJUIiksCiMgICBjb250cmFzdHMgPSBsaXN0KGNoYXJhY3RlciA9IGNvbnRyYXN0c19zdW1fZWRnZSksCiMgICBjb3JlcyA9IDQsIGNvbnRyb2wgPSBsaXN0KGFkYXB0X2RlbHRhID0gMC45OTkpKQoKIyByX2QxYl9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUIDwtIGxtZXIoCiMgICBkaWZmIH4gMSArICgxIHwgY2hhcmFjdGVyKSwKIyAgIGRhdGEgPSBkMWJfYWRfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gSEVBUlQiKSwKIyAgIGNvbnRyYXN0cyA9IGxpc3QoY2hhcmFjdGVyID0gY29udHJhc3RzX3N1bV9lZGdlKSkKCnJfZDFiX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQgPC0gbG0oCiAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIsCiAgZGF0YSA9IGQxYl9hZF9zY29yZWRfYWRfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFkgLSBIRUFSVCIpLAogIGNvbnRyYXN0cyA9IGxpc3QoY2hhcmFjdGVyID0gY29udHJhc3RzX3N1bV9lZGdlKSkKCiMgcl9kMWJfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCA8LSBsbSgKIyAgIGRpZmYgfiAxLAojICAgZGF0YSA9IGQxYl9hZF9zY29yZWRfYWRfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFkgLSBIRUFSVCIpKQoKc3VtbWFyeShyX2QxYl9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUKQpgYGAKCmBgYHtyfQojIHJfZDFiX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCA8LSBicm0oCiMgICBkaWZmIH4gMSArICgxIHwgY2hhcmFjdGVyKSwKIyAgIGRhdGEgPSBkMWJfYWRfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gTUlORCIpLAojICAgY29udHJhc3RzID0gbGlzdChjaGFyYWN0ZXIgPSBjb250cmFzdHNfc3VtX2VkZ2UpLAojICAgY29yZXMgPSA0LCBjb250cm9sID0gbGlzdChhZGFwdF9kZWx0YSA9IDAuOTk5KSkKCiMgcl9kMWJfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIDwtIGxtZXIoCiMgICBkaWZmIH4gMSArICgxIHwgY2hhcmFjdGVyKSwKIyAgIGRhdGEgPSBkMWJfYWRfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gTUlORCIpLAojICAgY29udHJhc3RzID0gbGlzdChjaGFyYWN0ZXIgPSBjb250cmFzdHNfc3VtX2VkZ2UpKQoKcl9kMWJfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIDwtIGxtKAogIGRpZmYgfiAxICsgY2hhcmFjdGVyLAogIGRhdGEgPSBkMWJfYWRfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gTUlORCIpLAogIGNvbnRyYXN0cyA9IGxpc3QoY2hhcmFjdGVyID0gY29udHJhc3RzX3N1bV9lZGdlKSkKCiMgcl9kMWJfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIDwtIGxtKAojICAgZGlmZiB+IDEsCiMgICBkYXRhID0gZDFiX2FkX3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIE1JTkQiKSkKCnN1bW1hcnkocl9kMWJfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EKQpgYGAKCmBgYHtyfQojIHJfZDFiX2FkX3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyAoMSB8IGNoYXJhY3RlciksCiMgICBkYXRhID0gZDFiX2FkX3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiSEVBUlQgLSBNSU5EIiksCiMgICBjb250cmFzdHMgPSBsaXN0KGNoYXJhY3RlciA9IGNvbnRyYXN0c19zdW1fZWRnZSksCiMgICBjb3JlcyA9IDQsIGNvbnRyb2wgPSBsaXN0KGFkYXB0X2RlbHRhID0gMC45OTkpKQoKIyByX2QxYl9hZF9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EIDwtIGxtZXIoCiMgICBkaWZmIH4gMSArICgxIHwgY2hhcmFjdGVyKSwKIyAgIGRhdGEgPSBkMWJfYWRfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJIRUFSVCAtIE1JTkQiKSwKIyAgIGNvbnRyYXN0cyA9IGxpc3QoY2hhcmFjdGVyID0gY29udHJhc3RzX3N1bV9lZGdlKSkKCnJfZDFiX2FkX3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQgPC0gbG0oCiAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIsCiAgZGF0YSA9IGQxYl9hZF9zY29yZWRfYWRfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkhFQVJUIC0gTUlORCIpLAogIGNvbnRyYXN0cyA9IGxpc3QoY2hhcmFjdGVyID0gY29udHJhc3RzX3N1bV9lZGdlKSkKCiMgcl9kMWJfYWRfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCA8LSBsbSgKIyAgIGRpZmYgfiAxLAojICAgZGF0YSA9IGQxYl9hZF9zY29yZWRfYWRfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkhFQVJUIC0gTUlORCIpKQoKc3VtbWFyeShyX2QxYl9hZF9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EKQpgYGAKCiMjIyBTdHVkeSAxYwoKSW4gU3R1ZHkgMWMsIGByIG5yb3coZDFjX2FkX3dpZGUpLzJgIFVTIGFkdWx0cyBlYWNoIGFzc2Vzc2VkIHR3byB0YXJnZXQgY2hhcmFjdGVycyBvbiA0MCBtZW50YWwgY2FwYWNpdGllcy4gTGlrZSBTdHVkaWVzIDFhIGFuZCAxYiwgdGhpcyBzdHVkeSBlbXBsb3llZCB0aGUgImVkZ2UgY2FzZSIgdmFyaWFudCBvZiB0aGUgZ2VuZXJhbCBhcHByb2FjaDsgYnV0IGluIHRoaXMgc3R1ZHksIGFsbCBwYXJ0aWNpcGFudHMgYXNzZXNzZWQgYm90aCBvZiB0aGVzZSB0YXJnZXQgY2hhcmFjdGVycyBzaWRlIGJ5IHNpZGUgKHdpdGggbGVmdC1yaWdodCBwb3NpdGlvbiBjb3VudGVyYmFsYW5lZCBhY3Jvc3MgcGFydGljaXBhbnRzKS4gKFNlZSBDaGFwdGVyIElJIGFuZCBXZWlzbWFuIGV0IGFsLiwgMjAxNywgZm9yIGRldGFpbGVkIG1ldGhvZHMuKQoKIyMjIyBTY2FsZSBjb25zdHJ1Y3Rpb24KCmBgYHtyfQpzY2FsZXNfZWZhX3dkbV9kMWNfYWQgPC0gc2NhbGVfZnVuKGVmYV93ZG1fZDFjX2FkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JfbmFtZXMgPSBmYWN0b3JfbmFtZXNfZWZhX3dkbV9kMWNfYWQpCmQxY19hZF9zY29yZWRfYWQgPC0gc2NvcmVfZnVuKGQxY19hZCwgc2NhbGVzX2VmYV93ZG1fZDFjX2FkKQoKc2F2ZVJEUyhzY2FsZXNfZWZhX3dkbV9kMWNfYWQsIGZpbGUgPSAiLi9zY2FsZXMvc2NhbGVzX2VmYV93ZG1fZDFjX2FkIikKc2F2ZVJEUyhkMWNfYWRfc2NvcmVkX2FkLCBmaWxlID0gIi4vc2NvcmVkX2RhdGEvZDFjX2FkX3Njb3JlZF9hZCIpCmBgYAoKRm9sbG93aW5nIHRoZSBzdGVwcyBkZXNjcmliZWQgaW4gIkdlbmVyYWwgYW5hbHlzaXMgcGxhbiwiIGFib3ZlLCB5aWVsZGVkIGByIGZhY3RfbmFtZV9mdW4oZmFjdG9yX25hbWVzX2VmYV93ZG1fZDFjX2FkKWAgc2NhbGVzIG9mIGByIHNjYWxlc19lZmFfd2RtX2QxY19hZCAlPiUgY291bnQoZmFjdG9yKSAlPiUgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKG4pKSAlPiUgc2VsZWN0KG1lYW4pICU+JSBhcy5udW1lcmljKClgIGl0ZW1zIGVhY2g7IHNlZSBUYWJsZSA0LjEuCgojIyMjIFZpc3VhbGl6YXRpb24KClhYCgpgYGB7cn0KcGxvdHNfZDFjX2FkX3Njb3JlZF9hZCA8LSByZWx2aXpfZnVuKGQxY19hZF9zY29yZWRfYWQpCmBgYAoKYGBge3J9CmZpZ19kMWNfYWRfcGxvdHMgPC0gcGxvdF9ncmlkKHBsb3RzX2QxY19hZF9zY29yZWRfYWRbWzFdXSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RzX2QxY19hZF9zY29yZWRfYWRbWzJdXSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RzX2QxY19hZF9zY29yZWRfYWRbWzNdXSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkMxIiwgIkMyIiwgIkMzIiksIG5jb2wgPSAzKQoKZmlnX2QxY19hZF9sZWcgPC0gZ2V0X2xlZ2VuZCgKICBwbG90c19kMWNfYWRfc2NvcmVkX2FkW1sxXV0gKwogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpICsKICAgIHNjYWxlX2ZpbGxfbWFudWFsKCJUYXJnZXQgY2hhcmFjdGVyIiwgdmFsdWVzID0gY29sb3JzMDIsCiAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZCh0aXRsZS5wb3NpdGlvbiA9ICJsZWZ0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9ICJob3Jpem9udGFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAyKSkgKwogICAgc2NhbGVfY29sb3JfbWFudWFsKCJUYXJnZXQgY2hhcmFjdGVyIiwgdmFsdWVzID0gY29sb3JzMDIsCiAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQodGl0bGUucG9zaXRpb24gPSAibGVmdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gImhvcml6b250YWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAyKSkpCgpmaWdfZDFjX2FkX3Bsb3RzX2xlZyA8LSBwbG90X2dyaWQoZmlnX2QxY19hZF9wbG90cywgZmlnX2QxY19hZF9sZWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDEsIDAuMDUpKQoKZmlnX2QxY19hZF90aXRsZSA8LSBnZ2RyYXcoKSArIAogIGRyYXdfbGFiZWwoIlN0dWR5IDFjOiBBZHVsdHMiLCBzaXplID0gMTYsIGZvbnRmYWNlID0gJ2JvbGQnLCB4ID0gMCwgaGp1c3QgPSAwKQoKZmlnX2QxY19hZF9wbG90c19sZWdfdGl0bGUgPC0gcGxvdF9ncmlkKGZpZ19kMWNfYWRfdGl0bGUsIGZpZ19kMWNfYWRfcGxvdHNfbGVnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygwLjEyLCAxKSkKYGBgCgojIyMjIEFuYWx5c2lzIG9mIGFzeW1tZXRyaWVzCgpYWAoKYGBge3J9CmQxY19hZF9zY29yZWRfYWRfZGlmZiA8LSBkaWZmX2Z1bihkMWNfYWRfc2NvcmVkX2FkKQpzYXZlUkRTKGQxY19hZF9zY29yZWRfYWRfZGlmZiwgIi4vZGlmZnNjb3JlX2RhdGEvZDFjX2FkX3Njb3JlZF9hZF9kaWZmIikKYGBgCgpgYGB7cn0KcGxvdF9kMWNfYWRfc2NvcmVkX2FkX2RpZmYgPC0gZGlmZnBsb3RfZnVuKGQxY19hZF9zY29yZWRfYWRfZGlmZikKYGBgCgpgYGB7cn0KIyByX2QxY19hZF9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUIDwtIGJybSgKIyAgIGRpZmYgfiAxICsgKDEgfCBjaGFyYWN0ZXIpICsgKDEgfCBzdWJpZCksCiMgICBkYXRhID0gZDFjX2FkX3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIEhFQVJUIiksCiMgICBjb250cmFzdHMgPSBsaXN0KGNoYXJhY3RlciA9IGNvbnRyYXN0c19zdW1fZWRnZSksCiMgICBjb3JlcyA9IDQsIGNvbnRyb2wgPSBsaXN0KGFkYXB0X2RlbHRhID0gMC45OTkpKQoKIyByX2QxY19hZF9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUIDwtIGxtZXIoCiMgICBkaWZmIH4gMSArICgxIHwgY2hhcmFjdGVyKSArICgxIHwgc3ViaWQpLAojICAgZGF0YSA9IGQxY19hZF9zY29yZWRfYWRfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFkgLSBIRUFSVCIpLAojICAgY29udHJhc3RzID0gbGlzdChjaGFyYWN0ZXIgPSBjb250cmFzdHNfc3VtX2VkZ2UpKQoKcl9kMWNfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCA8LSBsbWVyKAogIGRpZmYgfiAxICsgY2hhcmFjdGVyICsgKDEgfCBzdWJpZCksCiAgZGF0YSA9IGQxY19hZF9zY29yZWRfYWRfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFkgLSBIRUFSVCIpLAogIGNvbnRyYXN0cyA9IGxpc3QoY2hhcmFjdGVyID0gY29udHJhc3RzX3N1bV9lZGdlKSkKCiMgcl9kMWNfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCA8LSBsbWVyKAojICAgZGlmZiB+IDEgICsgKDEgfCBzdWJpZCksCiMgICBkYXRhID0gZDFjX2FkX3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIEhFQVJUIikpCgpzdW1tYXJ5KHJfZDFjX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQpCmBgYAoKYGBge3J9CiMgcl9kMWNfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIDwtIGJybSgKIyAgIGRpZmYgfiAxICsgKDEgfCBjaGFyYWN0ZXIpICsgKDEgfCBzdWJpZCksCiMgICBkYXRhID0gZDFjX2FkX3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIE1JTkQiKSwKIyAgIGNvbnRyYXN0cyA9IGxpc3QoY2hhcmFjdGVyID0gY29udHJhc3RzX3N1bV9lZGdlKSwKIyAgIGNvcmVzID0gNCwgY29udHJvbCA9IGxpc3QoYWRhcHRfZGVsdGEgPSAwLjk5OSkpCgojIHJfZDFjX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCA8LSBsbWVyKAojICAgZGlmZiB+IDEgKyAoMSB8IGNoYXJhY3RlcikgKyAoMSB8IHN1YmlkKSwKIyAgIGRhdGEgPSBkMWNfYWRfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gTUlORCIpLAojICAgY29udHJhc3RzID0gbGlzdChjaGFyYWN0ZXIgPSBjb250cmFzdHNfc3VtX2VkZ2UpKQoKcl9kMWNfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIDwtIGxtZXIoCiAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIgKyAoMSB8IHN1YmlkKSwKICBkYXRhID0gZDFjX2FkX3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIE1JTkQiKSwKICBjb250cmFzdHMgPSBsaXN0KGNoYXJhY3RlciA9IGNvbnRyYXN0c19zdW1fZWRnZSkpCgojIHJfZDFjX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCA8LSBsbWVyKAojICAgZGlmZiB+IDEgKyAoMSB8IHN1YmlkKSwKIyAgIGRhdGEgPSBkMWNfYWRfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gTUlORCIpKQoKc3VtbWFyeShyX2QxY19hZF9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQpCmBgYAoKYGBge3J9CiMgcl9kMWNfYWRfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCA8LSBicm0oCiMgICBkaWZmIH4gMSArICgxIHwgY2hhcmFjdGVyKSArICgxIHwgc3ViaWQpLAojICAgZGF0YSA9IGQxY19hZF9zY29yZWRfYWRfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkhFQVJUIC0gTUlORCIpLAojICAgY29udHJhc3RzID0gbGlzdChjaGFyYWN0ZXIgPSBjb250cmFzdHNfc3VtX2VkZ2UpLAojICAgY29yZXMgPSA0LCBjb250cm9sID0gbGlzdChhZGFwdF9kZWx0YSA9IDAuOTk5KSkKCiMgcl9kMWNfYWRfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCA8LSBsbWVyKAojICAgZGlmZiB+IDEgKyAoMSB8IGNoYXJhY3RlcikgKyAoMSB8IHN1YmlkKSwKIyAgIGRhdGEgPSBkMWNfYWRfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJIRUFSVCAtIE1JTkQiKSwKIyAgIGNvbnRyYXN0cyA9IGxpc3QoY2hhcmFjdGVyID0gY29udHJhc3RzX3N1bV9lZGdlKSkKCnJfZDFjX2FkX3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQgPC0gbG1lcigKICBkaWZmIH4gMSArIGNoYXJhY3RlciArICgxIHwgc3ViaWQpLAogIGRhdGEgPSBkMWNfYWRfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJIRUFSVCAtIE1JTkQiKSwKICBjb250cmFzdHMgPSBsaXN0KGNoYXJhY3RlciA9IGNvbnRyYXN0c19zdW1fZWRnZSkpCgojIHJfZDFjX2FkX3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQgPC0gbG1lcigKIyAgIGRpZmYgfiAxICsgKDEgfCBzdWJpZCksCiMgICBkYXRhID0gZDFjX2FkX3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiSEVBUlQgLSBNSU5EIikpCgpzdW1tYXJ5KHJfZDFjX2FkX3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQpCmBgYAoKIyMjIFN0dWR5IDFkCgpJbiBTdHVkeSAxZCwgYHIgbnJvdyhkMWRfYWRfd2lkZSlgIFVTIGFkdWx0cyBlYWNoIGFzc2Vzc2VkIGEgc2luZ2xlIHRhcmdldCBjaGFyYWN0ZXIgb24gNDAgbWVudGFsIGNhcGFjaXRpZXMuIFVubGlrZSBTdHVkaWVzIDFhLTFjLCB0aGlzIHN0dWR5IGVtcGxveWVkIHRoZSAibWFueSBjaGFyYWN0ZXJzIiB2YXJpYW50IG9mIHRoZSBnZW5lcmFsIGFwcHJvYWNoLCBpbiB3aGljaCBwYXJ0aWNpcGFudHMgd2VyZSByYW5kb21seSBhc3NpZ25lZCB0byBhc3Nlc3Mgb25lIG9mIHRoZSBmb2xsb3dpbmcgMjEgdGFyZ2V0IGNoYXJhY3RlcnM6IGFuIGFkdWx0LCBhIGNoaWxkLCBhbiBpbmZhbnQsIGEgcGVyc29uIGluIGEgcGVyc2lzdGVudCB2ZWdldGF0aXZlIHN0YXRlLCBhIGZldHVzLCBhIGNoaW1wYW56ZWUsIGFuIGVsZXBoYW50LCBhIGRvbHBoaW4sIGEgYmVhciwgYSBkb2csIGEgZ29hdCwgYSBtb3VzZSwgYSBmcm9nLCBhIGJsdWUgamF5LCBhIGZpc2gsIGEgYmVldGxlLCBhIG1pY3JvYmUsIGEgcm9ib3QsIGEgY29tcHV0ZXIsIGEgY2FyLCBvciBhIHN0YXBsZXIuIChTZWUgQ2hhcHRlciBJSSBhbmQgV2Vpc21hbiBldCBhbC4sIDIwMTcsIGZvciBkZXRhaWxlZCBtZXRob2RzLikKCiMjIyMgU2NhbGUgY29uc3RydWN0aW9uCgpgYGB7cn0Kc2NhbGVzX2VmYV93ZG1fZDFkX2FkIDwtIHNjYWxlX2Z1bihlZmFfd2RtX2QxZF9hZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yX25hbWVzID0gZmFjdG9yX25hbWVzX2VmYV93ZG1fZDFkX2FkKQpkMWRfYWRfc2NvcmVkX2FkIDwtIHNjb3JlX2Z1bihkMWRfYWQsIHNjYWxlc19lZmFfd2RtX2QxZF9hZCkKCnNhdmVSRFMoc2NhbGVzX2VmYV93ZG1fZDFkX2FkLCBmaWxlID0gIi4vc2NhbGVzL3NjYWxlc19lZmFfd2RtX2QxZF9hZCIpCnNhdmVSRFMoZDFkX2FkX3Njb3JlZF9hZCwgZmlsZSA9ICIuL3Njb3JlZF9kYXRhL2QxZF9hZF9zY29yZWRfYWQiKQpgYGAKCkZvbGxvd2luZyB0aGUgc3RlcHMgZGVzY3JpYmVkIGluICJHZW5lcmFsIGFuYWx5c2lzIHBsYW4sIiBhYm92ZSwgeWllbGRlZCBgciBmYWN0X25hbWVfZnVuKGZhY3Rvcl9uYW1lc19lZmFfd2RtX2QxZF9hZClgIHNjYWxlcyBvZiBgciBzY2FsZXNfZWZhX3dkbV9kMWRfYWQgJT4lIGNvdW50KGZhY3RvcikgJT4lIHN1bW1hcmlzZShtZWFuID0gbWVhbihuKSkgJT4lIHNlbGVjdChtZWFuKSAlPiUgYXMubnVtZXJpYygpYCBpdGVtcyBlYWNoOyBzZWUgVGFibGUgNC4xLgoKIyMjIyBWaXN1YWxpemF0aW9uCgpYWAoKYGBge3J9CnBsb3RzX2QxZF9hZF9zY29yZWRfYWQgPC0gcmVsdml6X2Z1bihkMWRfYWRfc2NvcmVkX2FkLCBjb2xvcnMgPSBjb2xvcnMyMSkKYGBgCgpgYGB7cn0KZmlnX2QxZF9hZF9wbG90cyA8LSBwbG90X2dyaWQocGxvdHNfZDFkX2FkX3Njb3JlZF9hZFtbMV1dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdHNfZDFkX2FkX3Njb3JlZF9hZFtbMl1dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdHNfZDFkX2FkX3Njb3JlZF9hZFtbM11dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiRDEiLCAiRDIiLCAiRDMiKSwgbmNvbCA9IDMpCgpmaWdfZDFkX2FkX2xlZyA8LSBnZXRfbGVnZW5kKAogIHBsb3RzX2QxZF9hZF9zY29yZWRfYWRbWzFdXSArCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikgKwogICAgc2NhbGVfZmlsbF9tYW51YWwoIlRhcmdldCBjaGFyYWN0ZXIiLCB2YWx1ZXMgPSBjb2xvcnMyMSwKICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKHRpdGxlLnBvc2l0aW9uID0gImxlZnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gImhvcml6b250YWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDcpKSArCiAgICBzY2FsZV9jb2xvcl9tYW51YWwoIlRhcmdldCBjaGFyYWN0ZXIiLCB2YWx1ZXMgPSBjb2xvcnMyMSwKICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZCh0aXRsZS5wb3NpdGlvbiA9ICJsZWZ0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDcpKSkKCmZpZ19kMWRfYWRfcGxvdHNfbGVnIDwtIHBsb3RfZ3JpZChmaWdfZDFkX2FkX3Bsb3RzLCBmaWdfZDFkX2FkX2xlZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMSwgMC4yKSkKCmZpZ19kMWRfYWRfdGl0bGUgPC0gZ2dkcmF3KCkgKyAKICBkcmF3X2xhYmVsKCJTdHVkeSAxZDogQWR1bHRzIiwgc2l6ZSA9IDE2LCBmb250ZmFjZSA9ICdib2xkJywgeCA9IDAsIGhqdXN0ID0gMCkKCmZpZ19kMWRfYWRfcGxvdHNfbGVnX3RpdGxlIDwtIHBsb3RfZ3JpZChmaWdfZDFkX2FkX3RpdGxlLCBmaWdfZDFkX2FkX3Bsb3RzX2xlZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMC4xMiwgMSkpCmBgYAoKIyMjIyBBbmFseXNpcyBvZiBhc3ltbWV0cmllcwoKWFgKCmBgYHtyfQpkMWRfYWRfc2NvcmVkX2FkX2RpZmYgPC0gZGlmZl9mdW4oZDFkX2FkX3Njb3JlZF9hZCkKc2F2ZVJEUyhkMWRfYWRfc2NvcmVkX2FkX2RpZmYsICIuL2RpZmZzY29yZV9kYXRhL2QxZF9hZF9zY29yZWRfYWRfZGlmZiIpCmBgYAoKYGBge3J9CnBsb3RfZDFkX2FkX3Njb3JlZF9hZF9kaWZmIDwtIGRpZmZwbG90X2Z1bihkMWRfYWRfc2NvcmVkX2FkX2RpZmYsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JzMjEsIHdpZCA9IDAuOSkKYGBgCgpgYGB7cn0KIyByX2QxZF9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUIDwtIGJybSgKIyAgIGRpZmYgfiAxICsgKDEgfCBjaGFyYWN0ZXIpLAojICAgZGF0YSA9IGQxZF9hZF9zY29yZWRfYWRfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFkgLSBIRUFSVCIpLAojICAgY29udHJhc3RzID0gbGlzdChjaGFyYWN0ZXIgPSBjb250cmFzdHNfc3VtX2R2MjEpLAojICAgY29yZXMgPSA0LCBjb250cm9sID0gbGlzdChhZGFwdF9kZWx0YSA9IDAuOTk5KSkKCiMgcl9kMWRfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCA8LSBsbWVyKAojICAgZGlmZiB+IDEgKyAoMSB8IGNoYXJhY3RlciksCiMgICBkYXRhID0gZDFkX2FkX3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIEhFQVJUIiksCiMgICBjb250cmFzdHMgPSBsaXN0KGNoYXJhY3RlciA9IGNvbnRyYXN0c19zdW1fZHYyMSkpCgpyX2QxZF9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUIDwtIGxtKAogIGRpZmYgfiAxICsgY2hhcmFjdGVyLAogIGRhdGEgPSBkMWRfYWRfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gSEVBUlQiKSwKICBjb250cmFzdHMgPSBsaXN0KGNoYXJhY3RlciA9IGNvbnRyYXN0c19zdW1fZHYyMSkpCgojIHJfZDFkX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQgPC0gbG0oCiMgICBkaWZmIH4gMSwKIyAgIGRhdGEgPSBkMWRfYWRfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gSEVBUlQiKSkKCnN1bW1hcnkocl9kMWRfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCkKYGBgCgpgYGB7cn0KIyByX2QxZF9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyAoMSB8IGNoYXJhY3RlciksCiMgICBkYXRhID0gZDFkX2FkX3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIE1JTkQiKSwKIyAgIGNvbnRyYXN0cyA9IGxpc3QoY2hhcmFjdGVyID0gY29udHJhc3RzX3N1bV9kdjIxKSwKIyAgIGNvcmVzID0gNCwgY29udHJvbCA9IGxpc3QoYWRhcHRfZGVsdGEgPSAwLjk5OSkpCgojIHJfZDFkX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCA8LSBsbWVyKAojICAgZGlmZiB+IDEgKyAoMSB8IGNoYXJhY3RlciksCiMgICBkYXRhID0gZDFkX2FkX3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIE1JTkQiKSwKIyAgIGNvbnRyYXN0cyA9IGxpc3QoY2hhcmFjdGVyID0gY29udHJhc3RzX3N1bV9kdjIxKSkKCnJfZDFkX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCA8LSBsbSgKICBkaWZmIH4gMSArIGNoYXJhY3RlciwKICBkYXRhID0gZDFkX2FkX3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIE1JTkQiKSwKICBjb250cmFzdHMgPSBsaXN0KGNoYXJhY3RlciA9IGNvbnRyYXN0c19zdW1fZHYyMSkpCgojIHJfZDFkX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCA8LSBsbSgKIyAgIGRpZmYgfiAxLAojICAgZGF0YSA9IGQxZF9hZF9zY29yZWRfYWRfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFkgLSBNSU5EIikpCgpzdW1tYXJ5KHJfZDFkX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCkKYGBgCgpgYGB7cn0KIyByX2QxZF9hZF9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EIDwtIGJybSgKIyAgIGRpZmYgfiAxICsgKDEgfCBjaGFyYWN0ZXIpLAojICAgZGF0YSA9IGQxZF9hZF9zY29yZWRfYWRfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkhFQVJUIC0gTUlORCIpLAojICAgY29udHJhc3RzID0gbGlzdChjaGFyYWN0ZXIgPSBjb250cmFzdHNfc3VtX2R2MjEpLAojICAgY29yZXMgPSA0LCBjb250cm9sID0gbGlzdChhZGFwdF9kZWx0YSA9IDAuOTk5KSkKCiMgcl9kMWRfYWRfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCA8LSBsbWVyKAojICAgZGlmZiB+IDEgKyAoMSB8IGNoYXJhY3RlciksCiMgICBkYXRhID0gZDFkX2FkX3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiSEVBUlQgLSBNSU5EIiksCiMgICBjb250cmFzdHMgPSBsaXN0KGNoYXJhY3RlciA9IGNvbnRyYXN0c19zdW1fZHYyMSkpCgpyX2QxZF9hZF9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EIDwtIGxtKAogIGRpZmYgfiAxICsgY2hhcmFjdGVyLAogIGRhdGEgPSBkMWRfYWRfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJIRUFSVCAtIE1JTkQiKSwKICBjb250cmFzdHMgPSBsaXN0KGNoYXJhY3RlciA9IGNvbnRyYXN0c19zdW1fZHYyMSkpCgojIHJfZDFkX2FkX3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQgPC0gbG0oCiMgICBkaWZmIH4gMSwKIyAgIGRhdGEgPSBkMWRfYWRfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJIRUFSVCAtIE1JTkQiKSkKCnN1bW1hcnkocl9kMWRfYWRfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCkKYGBgCgojIyBEaXNjdXNzaW9uCgpYWAoKYGBge3J9CnNjYWxlc19zdHVkeTEgPC0gYmluZF9yb3dzKHNjYWxlc19lZmFfd2RtX2QxYV9hZCAlPiUgbXV0YXRlKHN0dWR5ID0gIlN0dWR5IDFhIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlc19lZmFfd2RtX2QxYl9hZCAlPiUgbXV0YXRlKHN0dWR5ID0gIlN0dWR5IDFiIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlc19lZmFfd2RtX2QxY19hZCAlPiUgbXV0YXRlKHN0dWR5ID0gIlN0dWR5IDFjIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlc19lZmFfd2RtX2QxZF9hZCAlPiUgbXV0YXRlKHN0dWR5ID0gIlN0dWR5IDFkIikpICU+JQogIHNlbGVjdCgtYyhsb2FkaW5nLCBvcmRlcikpICU+JQogIGRpc3RpbmN0KCkgJT4lCiAgc3ByZWFkKHN0dWR5LCBmYWN0b3IpICU+JQogIG11dGF0ZSh1cl9mYWN0b3IgPSBpZmVsc2UoIWlzLm5hKGBTdHVkeSAxYWApLCBgU3R1ZHkgMWFgLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKCFpcy5uYShgU3R1ZHkgMWJgKSwgYFN0dWR5IDFiYCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoIWlzLm5hKGBTdHVkeSAxY2ApLCBgU3R1ZHkgMWNgLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgU3R1ZHkgMWRgKSkpKSAlPiUKICBsZWZ0X2pvaW4oc2NhbGVzX2VmYV93ZG1fZDFhX2FkICU+JSAKICAgICAgICAgICAgICBzZWxlY3QoY2FwYWNpdHksIG9yZGVyKSAlPiUgcmVuYW1lKG9yZGVyMWEgPSBvcmRlcikpICU+JQogIGxlZnRfam9pbihzY2FsZXNfZWZhX3dkbV9kMWJfYWQgJT4lIAogICAgICAgICAgICAgIHNlbGVjdChjYXBhY2l0eSwgb3JkZXIpICU+JSByZW5hbWUob3JkZXIxYiA9IG9yZGVyKSkgJT4lCiAgbGVmdF9qb2luKHNjYWxlc19lZmFfd2RtX2QxY19hZCAlPiUgCiAgICAgICAgICAgICAgc2VsZWN0KGNhcGFjaXR5LCBvcmRlcikgJT4lIHJlbmFtZShvcmRlcjFjID0gb3JkZXIpKSAlPiUKICBsZWZ0X2pvaW4oc2NhbGVzX2VmYV93ZG1fZDFkX2FkICU+JSAKICAgICAgICAgICAgICBzZWxlY3QoY2FwYWNpdHksIG9yZGVyKSAlPiUgcmVuYW1lKG9yZGVyMWQgPSBvcmRlcikpICU+JQogIGFycmFuZ2UodXJfZmFjdG9yLCBvcmRlcjFhLCBvcmRlcjFiLCBvcmRlcjFjLCBvcmRlcjFkKSAlPiUKICBzZWxlY3QoLWModXJfZmFjdG9yLCBzdGFydHNfd2l0aCgib3JkZXIiKSkpCmBgYAoKYGBge3J9CnRhYmxlNC4xIDwtIHNjYWxlc19zdHVkeTEgJT4lCiAgbXV0YXRlX2F0KHZhcnMoLWNhcGFjaXR5KSwKICAgICAgICAgICAgZnVucyhpZmVsc2UoaXMubmEoLiksICIiLCAi4pyTIikpKSAlPiUKICByZW5hbWUoQ2FwYWNpdHkgPSBjYXBhY2l0eSkgJT4lCiAga2FibGUoZm9ybWF0ID0gImh0bWwiLCAKICAgICAgICBjYXB0aW9uID0gIlRhYmxlIDQuMTogU2NhbGVzIGZvciBlYWNoIG9mIHRoZSBjb25jZXB0dWFsIHVuaXRzIChmYWN0b3JzKSBpZGVudGlmaWVkIGJ5IEVGQSBmb3IgVVMgQWR1bHRzIGluIFN0dWRpZXMgMWEtMWQgKHNlZSBDaGFwdGVyIElJSSkuIEEgY2hlY2ttYXJrIGluZGljYXRlcyB0aGF0IGEgbWVudGFsIGNhcGFjaXR5IHdhcyBpbmNsdWRlZCBpbiBhIHNjYWxlIGZvciBhIHBhcnRpY3VsYXIgc3R1ZHkuIikgJT4lICAKICBrYWJsZV9zdHlsaW5nKCkgJT4lCiAgZ3JvdXBfcm93cygiQk9EWSBzY2FsZSIsIDEsIDkpICU+JQogIGdyb3VwX3Jvd3MoIkhFQVJUIHNjYWxlIiwgMTAsIDE3KSAlPiUKICBncm91cF9yb3dzKCJNSU5EIHNjYWxlIiwgMTgsIDI2KQpgYGAKCmBgYHtyIHRhYmxlNC4xLCBpbmNsdWRlID0gVH0KdGFibGU0LjEKYGBgCgpgYGB7cn0KZmlndXJlNC4xIDwtIHBsb3RfZ3JpZChmaWdfZDFhX2FkX3Bsb3RzX2xlZ190aXRsZSwgZmlnX2QxYl9hZF9wbG90c19sZWdfdGl0bGUsCiAgICAgICAgICAgICAgICAgICAgICAgZmlnX2QxY19hZF9wbG90c19sZWdfdGl0bGUsIGZpZ19kMWRfYWRfcGxvdHNfbGVnX3RpdGxlLCAKICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDEsIDEsIDEsIDEuMTUpKQoKZmlndXJlNC4xX2NhcCA8LSBhZGRfc3ViKGZpZ3VyZTQuMSwgc3RyX3dyYXAoIkZpZ3VyZSA0LjE6IFJlbGF0aW9uc2hpcHMgYW1vbmcgVVMgYWR1bHRzJyBhdHRyaWJ1dGlvbnMgb2YgY29uY2VwdHVhbCB1bml0cyBpbiBTdHVkaWVzIDFhLTFkLCBvcmdhbml6ZWQgYnkgc3R1ZHkgKHJvd3MpIGFuZCBwYWlyIG9mIGNvbmNlcHR1YWwgdW5pdHMgKGNvbHVtbnMpLiBGb3IgZWFjaCBjb25jZXB0dWFsIHVuaXQsIHNjb3JlcyBjb3VsZCByYW5nZSBmcm9tIDAtMS4gSW5kaXZpZHVhbCBwYXJ0aWNpcGFudHMgYXJlIHBsb3R0ZWQgYXMgc21hbGwsIHRyYW5zbHVjZW50IGNpcmNsZXMsIGFuZCBtZWFuIHNjb3JlcyBieSBjaGFyYWN0ZXIgYXJlIHBsb3R0ZWQgYXMgbGFyZ2VyLCBzb2xpZCBkaWFtb25kcy4gRXJyb3IgYmFycyBhcmUgOTUlIGJvb3RzdHJhcHBlZCBjb25maWRlbmNlIGludGVydmFscy4gVGhlIGRvdHRlZCBsaW5lIGNvcnJlc3BvbmRzIHRvIGVxdWFsIGVuZG9yc2VtZW50cyBvZiB0aGUgdHdvIGNvbmNlcHR1YWwgdW5pdHMgcGxvdHRlZC4iLCAxMTApLCB4ID0gMCwgaGp1c3QgPSAwKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gVCwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDEuOH0KZ2dkcmF3KGZpZ3VyZTQuMV9jYXApCmBgYAoKYGBge3J9CmZpZ3VyZTQuMl9wbG90czEyMyA8LSBwbG90X2dyaWQocGxvdF9kMWFfYWRfc2NvcmVkX2FkX2RpZmYgKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYnModGl0bGUgPSAiU3R1ZHkgMWE6IEFkdWx0cyIpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RfZDFiX2FkX3Njb3JlZF9hZF9kaWZmICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJzKHRpdGxlID0gIlN0dWR5IDFiOiBBZHVsdHMiKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RfZDFjX2FkX3Njb3JlZF9hZF9kaWZmICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJzKHRpdGxlID0gIlN0dWR5IDFjOiBBZHVsdHMiKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMywgcmVsX3dpZHRocyA9IGMoMSwgMSwgMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gIkFVVE8iKQoKZmlndXJlNC4yX3Bsb3RzMTIzX2xlZyA8LSBwbG90X2dyaWQoZmlndXJlNC4yX3Bsb3RzMTIzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfbGVnZW5kKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RfZDFhX2FkX3Njb3JlZF9hZF9kaWZmICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMSwgMC4xKSkKCmZpZ3VyZTQuMl9wbG90czQgPC0gcGxvdF9ncmlkKHBsb3RfZDFkX2FkX3Njb3JlZF9hZF9kaWZmICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJzKHRpdGxlID0gIlN0dWR5IDFkOiBBZHVsdHMiKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gIkQiKQoKZmlndXJlNC4yX3Bsb3RzNF9sZWcgPC0gcGxvdF9ncmlkKGZpZ3VyZTQuMl9wbG90czQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfbGVnZW5kKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90X2QxZF9hZF9zY29yZWRfYWRfZGlmZiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMSwgMC4yKSkKCmZpZ3VyZTQuMl9wbG90cyA8LSBwbG90X2dyaWQoZmlndXJlNC4yX3Bsb3RzMTIzX2xlZywgZmlndXJlNC4yX3Bsb3RzNF9sZWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygxLCAxLjEpKQoKZmlndXJlNC4yX2NhcCA8LSBhZGRfc3ViKGZpZ3VyZTQuMl9wbG90cywgc3RyX3dyYXAoIkZpZ3VyZSA0LjI6IERpZmZlcmVuY2Ugc2NvcmVzIGJldHdlZW4gVVMgYWR1bHRzJyBhdHRyaWJ1dGlvbnMgb2YgY29uY2VwdHVhbCB1bml0cyBpbiBTdHVkaWVzIDFhLTFkLiBGb3IgZWFjaCBjb25jZXB0dWFsIHVuaXQsIHNjb3JlcyBjb3VsZCByYW5nZSBmcm9tIDAtMSwgc3VjaCB0aGF0IGRpZmZlcmVuY2Ugc2NvcmVzIGNvdWxkIHJhbmdlIGZyb20gLTEgdG8gKzEuIEluZGl2aWR1YWwgcGFydGljaXBhbnRzIGFyZSBwbG90dGVkIGFzIHNtYWxsLCB0cmFuc2x1Y2VudCBjaXJjbGVzLCBhbmQgbWVhbiBkaWZmZXJlbmNlIHNjb3JlcyBieSBjaGFyYWN0ZXIgYXJlIHBsb3R0ZWQgYXMgbGFyZ2VyLCBzb2xpZCBkaWFtb25kcy4gRXJyb3IgYmFycyBhcmUgOTUlIGJvb3RzdHJhcHBlZCBjb25maWRlbmNlIGludGVydmFscy4gVGhlIGRvdHRlZCBsaW5lIGNvcnJlc3BvbmRzIHRvIGVxdWFsIGVuZG9yc2VtZW50cyBvZiB0aGUgdHdvIGNvbmNlcHR1YWwgdW5pdHMgcGxvdHRlZCAoaS5lLiwgYSBkaWZmZXJlbmNlIHNjb3JlIG9mIDApLiIsIDE0MCksIHggPSAwLCBoanVzdCA9IDApCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBULCBmaWcud2lkdGggPSA2LCBmaWcuYXNwID0gMC44fQpnZ2RyYXcoZmlndXJlNC4yX2NhcCkKYGBgCgoKIyBTdHVkeSAyOiBDb25jZXB0dWFsIGNoYW5nZSBiZXR3ZWVuIG1pZGRsZSBjaGlsZGhvb2QgKDctOXkpIGFuZCBhZHVsdGhvb2QKCkluIFN0dWR5IDIsIGByIG5yb3coZDJfYWRfd2lkZSlgIFVTIGFkdWx0cyBhbmQgYHIgbnJvdyhkMl83OV93aWRlKWAgVVMgY2hpbGRyZW4gYmV0d2VlbiB0aGUgYWdlcyBvZiBgciBzdW1tYXJ5KGQyXzc5JGFnZSlbIk1pbi4iXSAlPiUgcm91bmQoMilgLWByIHN1bW1hcnkoZDJfNzkkYWdlKVsiTWF4LiJdICU+JSByb3VuZCgyKWAgeWVhcnMgKG1lZGlhbjogYHIgc3VtbWFyeShkMl83OSRhZ2UpWyJNZWRpYW4iXSAlPiUgcm91bmQoMilgeSkgZWFjaCBhc3Nlc3NlZCBhIHNpbmdsZSB0YXJnZXQgY2hhcmFjdGVyIG9uIDQwIG1lbnRhbCBjYXBhY2l0aWVzLiBUbyBtYWtlIHRoZSBzdHVkeSBhcHByb3ByaWF0ZSBmb3IgY2hpbGRyZW4gaW4gdGhpcyBhZ2UgcmFuZ2UsIHRoZSB3b3JkaW5nIG9mIHNvbWUgdGhlIDQwIG1lbnRhbCBjYXBhY2l0aWVzIGVtcGxveWVkIGluIFN0dWR5IDEgd2FzIG1vZGlmaWVkIHRvIHVzZSBtb3JlIGFnZS1hcHByb3ByaWF0ZSB2b2NhYnVsYXJ5LCBhbmQgcGFydGljaXBhbnRzIHJlc3BvbmRlZCBvbiBhIDMtcG9pbnQgc2NhbGUgKCJubywiIGNvZGVkIGFzIDA7ICJraW5kYSwiIGNvZGVkIGFzIDAuNSwgInllcywiIGNvZGVkIGFzIDEpLiBUaGlzIHN0dWR5IGVtcGxveWVkIHRoZSAiZWRnZSBjYXNlIiB2YXJpYW50IG9mIHRoZSBnZW5lcmFsIGFwcHJvYWNoLCB3aXRoIHBhcnRpY2lwYW50cyByYW5kb21seSBhc3NpZ25lZCB0byBhc3Nlc3MgZWl0aGVyIGEgYmVldGxlIG9yIGEgcm9ib3QuIChTZWUgQ2hhcHRlciBJSSBmb3IgZGV0YWlsZWQgbWV0aG9kcy4pCgojIyBTcGVjaWFsIG5vdGVzIG9uIGRhdGEgcHJvY2Vzc2luZyBhbmQgYW5hbHlzaXMKCiMjIFJlc3VsdHMKCiMjIyBBZHVsdHMKCiMjIyMgU2NhbGUgY29uc3RydWN0aW9uCgpgYGB7cn0Kc2NhbGVzX2VmYV93ZG1fZDJfYWQgPC0gc2NhbGVfZnVuKGVmYV93ZG1fZDJfYWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9uYW1lcyA9IGZhY3Rvcl9uYW1lc19lZmFfd2RtX2QyX2FkKQpkMl9hZF9zY29yZWRfYWQgPC0gc2NvcmVfZnVuKGQyX2FkLCBzY2FsZXNfZWZhX3dkbV9kMl9hZCkKCnNhdmVSRFMoc2NhbGVzX2VmYV93ZG1fZDJfYWQsIGZpbGUgPSAiLi9zY2FsZXMvc2NhbGVzX2VmYV93ZG1fZDJfYWQiKQpzYXZlUkRTKGQyX2FkX3Njb3JlZF9hZCwgZmlsZSA9ICIuL3Njb3JlZF9kYXRhL2QyX2FkX3Njb3JlZF9hZCIpCmBgYAoKRm9sbG93aW5nIHRoZSBzdGVwcyBkZXNjcmliZWQgaW4gIkdlbmVyYWwgYW5hbHlzaXMgcGxhbiwiIGFib3ZlLCB5aWVsZGVkIGByIGZhY3RfbmFtZV9mdW4oZmFjdG9yX25hbWVzX2VmYV93ZG1fZDJfYWQpYCBzY2FsZXMgb2YgYHIgc2NhbGVzX2VmYV93ZG1fZDJfYWQgJT4lIGNvdW50KGZhY3RvcikgJT4lIHN1bW1hcmlzZShtZWFuID0gbWVhbihuKSkgJT4lIHNlbGVjdChtZWFuKSAlPiUgYXMubnVtZXJpYygpYCBpdGVtcyBlYWNoOyBzZWUgVGFibGUgNC4yLgoKIyMjIyBWaXN1YWxpemF0aW9uCgpgYGB7cn0KcGxvdHNfZDJfYWRfc2NvcmVkX2FkIDwtIHJlbHZpel9mdW4oZDJfYWRfc2NvcmVkX2FkKQpgYGAKCmBgYHtyfQpmaWdfZDJfYWRfcGxvdHMgPC0gcGxvdF9ncmlkKHBsb3RzX2QyX2FkX3Njb3JlZF9hZFtbMV1dICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdHNfZDJfYWRfc2NvcmVkX2FkW1syXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdHNfZDJfYWRfc2NvcmVkX2FkW1szXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQTEiLCAiQTIiLCAiQTMiKSwgbmNvbCA9IDMpCgpmaWdfZDJfYWRfbGVnIDwtIGdldF9sZWdlbmQoCiAgcGxvdHNfZDJfYWRfc2NvcmVkX2FkW1sxXV0gKyAKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLCBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKSArCiAgICBzY2FsZV9maWxsX21hbnVhbCgiVGFyZ2V0IGNoYXJhY3RlciIsIHZhbHVlcyA9IGNvbG9yczAyLAogICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQodGl0bGUucG9zaXRpb24gPSAibGVmdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMikpICsKICAgIHNjYWxlX2NvbG9yX21hbnVhbCgiVGFyZ2V0IGNoYXJhY3RlciIsIHZhbHVlcyA9IGNvbG9yczAyLAogICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKHRpdGxlLnBvc2l0aW9uID0gImxlZnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9ICJob3Jpem9udGFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMikpKQoKZmlnX2QyX2FkX3Bsb3RzX2xlZyA8LSBwbG90X2dyaWQoZmlnX2QyX2FkX3Bsb3RzLCBmaWdfZDJfYWRfbGVnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDEsIDAuMDUpKQoKZmlnX2QyX2FkX3RpdGxlIDwtIGdnZHJhdygpICsgCiAgZHJhd19sYWJlbCgiU3R1ZHkgMjogQWR1bHRzIiwgc2l6ZSA9IDE2LCBmb250ZmFjZSA9ICdib2xkJywgeCA9IDAsIGhqdXN0ID0gMCkKCmZpZ19kMl9hZF9wbG90c19sZWdfdGl0bGUgPC0gcGxvdF9ncmlkKGZpZ19kMl9hZF90aXRsZSwgZmlnX2QyX2FkX3Bsb3RzX2xlZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygwLjEyLCAxKSkKYGBgCgojIyMjIEFuYWx5c2lzIG9mIGFzeW1tZXRyaWVzCgpgYGB7cn0KZDJfYWRfc2NvcmVkX2FkX2RpZmYgPC0gZGlmZl9mdW4oZDJfYWRfc2NvcmVkX2FkKQpzYXZlUkRTKGQyX2FkX3Njb3JlZF9hZF9kaWZmLCAiLi9kaWZmc2NvcmVfZGF0YS9kMl9hZF9zY29yZWRfYWRfZGlmZiIpCmBgYAoKYGBge3J9CnBsb3RfZDJfYWRfc2NvcmVkX2FkX2RpZmYgPC0gZGlmZnBsb3RfZnVuKGQyX2FkX3Njb3JlZF9hZF9kaWZmLCBjb2xvcnMwMikKYGBgCgpgYGB7cn0KIyByX2QyX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyAoMSB8IGNoYXJhY3RlciksCiMgICBkYXRhID0gZDJfYWRfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gSEVBUlQiKSwKIyAgIGNvbnRyYXN0cyA9IGxpc3QoY2hhcmFjdGVyID0gY29udHJhc3RzX3N1bV9lZGdlKSwKIyAgIGNvcmVzID0gNCwgY29udHJvbCA9IGxpc3QoYWRhcHRfZGVsdGEgPSAwLjk5OSkpCgojIHJfZDJfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCA8LSBsbWVyKAojICAgZGlmZiB+IDEgKyAoMSB8IGNoYXJhY3RlciksCiMgICBkYXRhID0gZDJfYWRfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gSEVBUlQiKSwKIyAgIGNvbnRyYXN0cyA9IGxpc3QoY2hhcmFjdGVyID0gY29udHJhc3RzX3N1bV9lZGdlKSkKCnJfZDJfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCA8LSBsbSgKICBkaWZmIH4gMSArIGNoYXJhY3RlciwKICBkYXRhID0gZDJfYWRfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gSEVBUlQiKSwKICBjb250cmFzdHMgPSBsaXN0KGNoYXJhY3RlciA9IGNvbnRyYXN0c19zdW1fZWRnZSkpCgojIHJfZDJfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCA8LSBsbSgKIyAgIGRpZmYgfiAxLAojICAgZGF0YSA9IGQyX2FkX3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIEhFQVJUIikpCgpzdW1tYXJ5KHJfZDJfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCkKYGBgCgpgYGB7cn0KIyByX2QyX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCA8LSBicm0oCiMgICBkaWZmIH4gMSArICgxIHwgY2hhcmFjdGVyKSwKIyAgIGRhdGEgPSBkMl9hZF9zY29yZWRfYWRfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFkgLSBNSU5EIiksCiMgICBjb250cmFzdHMgPSBsaXN0KGNoYXJhY3RlciA9IGNvbnRyYXN0c19zdW1fZWRnZSksCiMgICBjb3JlcyA9IDQsIGNvbnRyb2wgPSBsaXN0KGFkYXB0X2RlbHRhID0gMC45OTkpKQoKIyByX2QyX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCA8LSBsbWVyKAojICAgZGlmZiB+IDEgKyAoMSB8IGNoYXJhY3RlciksCiMgICBkYXRhID0gZDJfYWRfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gTUlORCIpLAojICAgY29udHJhc3RzID0gbGlzdChjaGFyYWN0ZXIgPSBjb250cmFzdHNfc3VtX2VkZ2UpKQoKcl9kMl9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQgPC0gbG0oCiAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIsCiAgZGF0YSA9IGQyX2FkX3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIE1JTkQiKSwKICBjb250cmFzdHMgPSBsaXN0KGNoYXJhY3RlciA9IGNvbnRyYXN0c19zdW1fZWRnZSkpCgojIHJfZDJfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIDwtIGxtKAojICAgZGlmZiB+IDEsCiMgICBkYXRhID0gZDJfYWRfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gTUlORCIpKQoKc3VtbWFyeShyX2QyX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCkKYGBgCgpgYGB7cn0KIyByX2QyX2FkX3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyAoMSB8IGNoYXJhY3RlciksCiMgICBkYXRhID0gZDJfYWRfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJIRUFSVCAtIE1JTkQiKSwKIyAgIGNvbnRyYXN0cyA9IGxpc3QoY2hhcmFjdGVyID0gY29udHJhc3RzX3N1bV9lZGdlKSwKIyAgIGNvcmVzID0gNCwgY29udHJvbCA9IGxpc3QoYWRhcHRfZGVsdGEgPSAwLjk5OSkpCgojIHJfZDJfYWRfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCA8LSBsbWVyKAojICAgZGlmZiB+IDEgKyAoMSB8IGNoYXJhY3RlciksCiMgICBkYXRhID0gZDJfYWRfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJIRUFSVCAtIE1JTkQiKSwKIyAgIGNvbnRyYXN0cyA9IGxpc3QoY2hhcmFjdGVyID0gY29udHJhc3RzX3N1bV9lZGdlKSkKCnJfZDJfYWRfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCA8LSBsbSgKICBkaWZmIH4gMSArIGNoYXJhY3RlciwKICBkYXRhID0gZDJfYWRfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJIRUFSVCAtIE1JTkQiKSwKICBjb250cmFzdHMgPSBsaXN0KGNoYXJhY3RlciA9IGNvbnRyYXN0c19zdW1fZWRnZSkpCgojIHJfZDJfYWRfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCA8LSBsbSgKIyAgIGRpZmYgfiAxLAojICAgZGF0YSA9IGQyX2FkX3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiSEVBUlQgLSBNSU5EIikpCgpzdW1tYXJ5KHJfZDJfYWRfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCkKYGBgCgpYWAoKIyMjIENoaWxkcmVuICg3LTl5KQoKIyMjIyBTY2FsZSBjb25zdHJ1Y3Rpb24KCmBgYHtyfQpzY2FsZXNfZWZhX3dkbV9kMl83OSA8LSBzY2FsZV9mdW4oZWZhX3dkbV9kMl83OSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yX25hbWVzID0gZmFjdG9yX25hbWVzX2VmYV93ZG1fZDJfNzkpCmQyXzc5X3Njb3JlZF9hZCA8LSBzY29yZV9mdW4oZDJfNzksIHNjYWxlc19lZmFfd2RtX2QyX2FkKQpkMl83OV9zY29yZWRfNzkgPC0gc2NvcmVfZnVuKGQyXzc5LCBzY2FsZXNfZWZhX3dkbV9kMl83OSkKCnNhdmVSRFMoc2NhbGVzX2VmYV93ZG1fZDJfNzksIGZpbGUgPSAiLi9zY2FsZXMvc2NhbGVzX2VmYV93ZG1fZDJfNzkiKQpzYXZlUkRTKGQyXzc5X3Njb3JlZF9hZCwgZmlsZSA9ICIuL3Njb3JlZF9kYXRhL2QyXzc5X3Njb3JlZF9hZCIpCnNhdmVSRFMoZDJfNzlfc2NvcmVkXzc5LCBmaWxlID0gIi4vc2NvcmVkX2RhdGEvZDJfNzlfc2NvcmVkXzc5IikKYGBgCgpGb2xsb3dpbmcgdGhlIHN0ZXBzIGRlc2NyaWJlZCBpbiAiR2VuZXJhbCBhbmFseXNpcyBwbGFuLCIgYWJvdmUsIHlpZWxkZWQgYHIgZmFjdF9uYW1lX2Z1bihmYWN0b3JfbmFtZXNfZWZhX3dkbV9kMl83OSlgIHNjYWxlcyBvZiBgciBzY2FsZXNfZWZhX3dkbV9kMl83OSAlPiUgY291bnQoZmFjdG9yKSAlPiUgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKG4pKSAlPiUgc2VsZWN0KG1lYW4pICU+JSBhcy5udW1lcmljKClgIGl0ZW1zIGVhY2g7IHNlZSBUYWJsZSA0LjIuCgojIyMjIFZpc3VhbGl6YXRpb24KCiMjIyMjIFVzaW5nIGFkdWx0cycgc2NhbGVzCgpYWAoKYGBge3J9CnBsb3RzX2QyXzc5X3Njb3JlZF9hZCA8LSByZWx2aXpfZnVuKGQyXzc5X3Njb3JlZF9hZCkKYGBgCgpgYGB7cn0KZmlnX2QyXzc5X3Njb3JlZF9hZF9wbG90cyA8LSBwbG90X2dyaWQocGxvdHNfZDJfNzlfc2NvcmVkX2FkW1sxXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90c19kMl83OV9zY29yZWRfYWRbWzJdXSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RzX2QyXzc5X3Njb3JlZF9hZFtbM11dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQjEiLCAiQjIiLCAiQjMiKSwgbmNvbCA9IDMpCgpmaWdfZDJfNzlfc2NvcmVkX2FkX2xlZyA8LSBnZXRfbGVnZW5kKAogIHBsb3RzX2QyXzc5X3Njb3JlZF9hZFtbMV1dICsgCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikgKwogICAgc2NhbGVfZmlsbF9tYW51YWwoIlRhcmdldCBjaGFyYWN0ZXIiLCB2YWx1ZXMgPSBjb2xvcnMwMiwKICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKHRpdGxlLnBvc2l0aW9uID0gImxlZnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gImhvcml6b250YWwiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAyKSkgKwogICAgc2NhbGVfY29sb3JfbWFudWFsKCJUYXJnZXQgY2hhcmFjdGVyIiwgdmFsdWVzID0gY29sb3JzMDIsCiAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQodGl0bGUucG9zaXRpb24gPSAibGVmdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gImhvcml6b250YWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAyKSkpCgpmaWdfZDJfNzlfc2NvcmVkX2FkX3Bsb3RzX2xlZyA8LSBwbG90X2dyaWQoCiAgZmlnX2QyXzc5X3Njb3JlZF9hZF9wbG90cywgZmlnX2QyXzc5X3Njb3JlZF9hZF9sZWcsCiAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygxLCAwLjA1KSkKCmZpZ19kMl83OV9zY29yZWRfYWRfdGl0bGUgPC0gZ2dkcmF3KCkgKyAKICBkcmF3X2xhYmVsKCJTdHVkeSAyOiBDaGlsZHJlbiwgNy05eSAoc2NvcmVkIHVzaW5nIGFkdWx0cycgc2NhbGVzKSIsIAogICAgICAgICAgICAgc2l6ZSA9IDE2LCBmb250ZmFjZSA9ICdib2xkJywgeCA9IDAsIGhqdXN0ID0gMCkKCmZpZ19kMl83OV9zY29yZWRfYWRfcGxvdHNfbGVnX3RpdGxlIDwtIHBsb3RfZ3JpZCgKICBmaWdfZDJfNzlfc2NvcmVkX2FkX3RpdGxlLCBmaWdfZDJfNzlfc2NvcmVkX2FkX3Bsb3RzX2xlZywKICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDAuMTIsIDEpKQpgYGAKCmBgYHtyfQpwbG90c19hZ2VncF9kMl9zY29yZWRfYWQgPC0gcmVsdml6X2FnZWdwX2Z1bigKICBkX3Njb3JlZCA9IGQyX2FkX3Njb3JlZF9hZCAlPiUgZnVsbF9qb2luKGQyXzc5X3Njb3JlZF9hZCksIAogIGFnZV9ncm91cHMgPSBjKCJjaGlsZHJlbjc5IiwgImFkdWx0cyIpLAogIGFnZV9ncm91cF9sYWJlbHMgPSBjKCJDaGlsZHJlbiAoNy05eSkiLCAiQWR1bHRzIikpCmBgYAoKYGBge3J9CmZpZ19kMl9hbGxfc2NvcmVkX2FkX3Bsb3RzIDwtIHBsb3RfZ3JpZChwbG90c19hZ2VncF9kMl9zY29yZWRfYWRbWzFdXSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdHNfYWdlZ3BfZDJfc2NvcmVkX2FkW1syXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RzX2FnZWdwX2QyX3Njb3JlZF9hZFtbM11dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJDMSIsICJDMiIsICJDMyIpLCBuY29sID0gMykKCmZpZ19kMl9hbGxfc2NvcmVkX2FkX2xlZyA8LSBnZXRfbGVnZW5kKAogIHBsb3RzX2FnZWdwX2QyX3Njb3JlZF9hZFtbMV1dICsKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLCBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKSArCiAgICBzY2FsZV9jb2xvcl9tYW51YWwoIlRhcmdldCBjaGFyYWN0ZXIiLCB2YWx1ZXMgPSBjb2xvcnMwMiwKICAgICAgICAgICAgICAgICAgICAgICBuYS50cmFuc2xhdGUgPSBGLAogICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKHRpdGxlLnBvc2l0aW9uID0gImxlZnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9ICJob3Jpem9udGFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMikpKQoKZmlnX2QyX2FsbF9zY29yZWRfYWRfcGxvdHNfbGVnIDwtIHBsb3RfZ3JpZCgKICBmaWdfZDJfYWxsX3Njb3JlZF9hZF9wbG90cywgZmlnX2QyX2FsbF9zY29yZWRfYWRfbGVnLAogIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMSwgMC4wNSkpCgpmaWdfZDJfYWxsX3Njb3JlZF9hZF90aXRsZSA8LSBnZ2RyYXcoKSArIAogIGRyYXdfbGFiZWwoIlRyYWNraW5nIGRldmVsb3BtZW50IGJldHdlZW4gNy05eSBhbmQgYWR1bHRob29kIChzY29yZWQgdXNpbmcgYWR1bHRzJyBzY2FsZXMpIiwgc2l6ZSA9IDE2LCBmb250ZmFjZSA9ICdib2xkJywgeCA9IDAsIGhqdXN0ID0gMCkKCmZpZ19kMl9hbGxfc2NvcmVkX2FkX3Bsb3RzX2xlZ190aXRsZSA8LSBwbG90X2dyaWQoCiAgZmlnX2QyX2FsbF9zY29yZWRfYWRfdGl0bGUsIGZpZ19kMl9hbGxfc2NvcmVkX2FkX3Bsb3RzX2xlZywKICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDAuMTIsIDEpKQpgYGAKCiMjIyMjIFVzaW5nIGNoaWxkcmVuJ3Mgb3duIHNjYWxlcwoKWFgKCmBgYHtyfQpwbG90c19kMl83OV9zY29yZWRfNzkgPC0gcmVsdml6X2Z1bihkMl83OV9zY29yZWRfNzkpCmBgYAoKYGBge3J9CmZpZ19kMl83OV9zY29yZWRfNzlfcGxvdHMgPC0gcGxvdF9ncmlkKHBsb3RzX2QyXzc5X3Njb3JlZF83OVtbMV1dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdHNfZDJfNzlfc2NvcmVkXzc5W1syXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90c19kMl83OV9zY29yZWRfNzlbWzNdXSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkExIiwgIkEyIiwgIkEzIiksIG5jb2wgPSAzKQoKZmlnX2QyXzc5X3Njb3JlZF83OV9sZWcgPC0gZ2V0X2xlZ2VuZCgKICBwbG90c19kMl83OV9zY29yZWRfNzlbWzFdXSArCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikgKwogICAgc2NhbGVfZmlsbF9tYW51YWwoIlRhcmdldCBjaGFyYWN0ZXIiLCB2YWx1ZXMgPSBjb2xvcnMwMiwKICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKHRpdGxlLnBvc2l0aW9uID0gImxlZnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gImhvcml6b250YWwiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAyKSkgKwogICAgc2NhbGVfY29sb3JfbWFudWFsKCJUYXJnZXQgY2hhcmFjdGVyIiwgdmFsdWVzID0gY29sb3JzMDIsCiAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQodGl0bGUucG9zaXRpb24gPSAibGVmdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gImhvcml6b250YWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAyKSkpCgpmaWdfZDJfNzlfc2NvcmVkXzc5X3Bsb3RzX2xlZyA8LSBwbG90X2dyaWQoZmlnX2QyXzc5X3Njb3JlZF83OV9wbG90cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZ19kMl83OV9zY29yZWRfNzlfbGVnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygxLCAwLjA1KSkKCmZpZ19kMl83OV9zY29yZWRfNzlfdGl0bGUgPC0gZ2dkcmF3KCkgKyAKICBkcmF3X2xhYmVsKCJTdHVkeSAyOiBDaGlsZHJlbiwgNy05eSAoc2NvcmVkIHVzaW5nIHRoZWlyIG93biBzY2FsZXMpIiwgCiAgICAgICAgICAgICBzaXplID0gMTYsIGZvbnRmYWNlID0gJ2JvbGQnLCB4ID0gMCwgaGp1c3QgPSAwKQoKZmlnX2QyXzc5X3Njb3JlZF83OV9wbG90c19sZWdfdGl0bGUgPC0gcGxvdF9ncmlkKAogIGZpZ19kMl83OV9zY29yZWRfNzlfdGl0bGUsIGZpZ19kMl83OV9zY29yZWRfNzlfcGxvdHNfbGVnLAogIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMC4xMiwgMSkpCmBgYAoKIyMjIyBBbmFseXNpcyBvZiBhc3ltbWV0cmllcwoKYGBge3J9CmQyXzc5X3Njb3JlZF9hZF9kaWZmIDwtIGRpZmZfZnVuKGQyXzc5X3Njb3JlZF9hZCkKZDJfNzlfc2NvcmVkXzc5X2RpZmYgPC0gZGlmZl9mdW4oZDJfNzlfc2NvcmVkXzc5KQpzYXZlUkRTKGQyXzc5X3Njb3JlZF9hZF9kaWZmLCAiLi9kaWZmc2NvcmVfZGF0YS9kMl83OV9zY29yZWRfYWRfZGlmZiIpCnNhdmVSRFMoZDJfNzlfc2NvcmVkXzc5X2RpZmYsICIuL2RpZmZzY29yZV9kYXRhL2QyXzc5X3Njb3JlZF83OV9kaWZmIikKYGBgCgojIyMjIyBVc2luZyBhZHVsdHMnIHNjYWxlcwoKYGBge3J9CnBsb3RfZDJfNzlfc2NvcmVkX2FkX2RpZmYgPC0gZGlmZnBsb3RfZnVuKGQyXzc5X3Njb3JlZF9hZF9kaWZmLCBjb2xvcnMwMikKYGBgCgpgYGB7cn0KIyByX2QyXzc5X3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyAoMSB8IGNoYXJhY3RlciksCiMgICBkYXRhID0gZDJfNzlfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gSEVBUlQiKSwKIyAgIGNvbnRyYXN0cyA9IGxpc3QoY2hhcmFjdGVyID0gY29udHJhc3RzX3N1bV9lZGdlKSwKIyAgIGNvcmVzID0gNCwgY29udHJvbCA9IGxpc3QoYWRhcHRfZGVsdGEgPSAwLjk5OSkpCgojIHJfZDJfNzlfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCA8LSBsbWVyKAojICAgZGlmZiB+IDEgKyAoMSB8IGNoYXJhY3RlciksCiMgICBkYXRhID0gZDJfNzlfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gSEVBUlQiKSwKIyAgIGNvbnRyYXN0cyA9IGxpc3QoY2hhcmFjdGVyID0gY29udHJhc3RzX3N1bV9lZGdlKSkKCnJfZDJfNzlfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCA8LSBsbSgKICBkaWZmIH4gMSArIGNoYXJhY3RlciwKICBkYXRhID0gZDJfNzlfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gSEVBUlQiKSwKICBjb250cmFzdHMgPSBsaXN0KGNoYXJhY3RlciA9IGNvbnRyYXN0c19zdW1fZWRnZSkpCgojIHJfZDJfNzlfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCA8LSBsbSgKIyAgIGRpZmYgfiAxLAojICAgZGF0YSA9IGQyXzc5X3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIEhFQVJUIikpCgpzdW1tYXJ5KHJfZDJfNzlfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCkKYGBgCgpgYGB7cn0KIyByX2QyXzc5X3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCA8LSBicm0oCiMgICBkaWZmIH4gMSArICgxIHwgY2hhcmFjdGVyKSwKIyAgIGRhdGEgPSBkMl83OV9zY29yZWRfYWRfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFkgLSBNSU5EIiksCiMgICBjb250cmFzdHMgPSBsaXN0KGNoYXJhY3RlciA9IGNvbnRyYXN0c19zdW1fZWRnZSksCiMgICBjb3JlcyA9IDQsIGNvbnRyb2wgPSBsaXN0KGFkYXB0X2RlbHRhID0gMC45OTkpKQoKIyByX2QyXzc5X3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCA8LSBsbWVyKAojICAgZGlmZiB+IDEgKyAoMSB8IGNoYXJhY3RlciksCiMgICBkYXRhID0gZDJfNzlfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gTUlORCIpLAojICAgY29udHJhc3RzID0gbGlzdChjaGFyYWN0ZXIgPSBjb250cmFzdHNfc3VtX2VkZ2UpKQoKcl9kMl83OV9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQgPC0gbG0oCiAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIsCiAgZGF0YSA9IGQyXzc5X3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIE1JTkQiKSwKICBjb250cmFzdHMgPSBsaXN0KGNoYXJhY3RlciA9IGNvbnRyYXN0c19zdW1fZWRnZSkpCgojIHJfZDJfNzlfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIDwtIGxtKAojICAgZGlmZiB+IDEsCiMgICBkYXRhID0gZDJfNzlfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gTUlORCIpKQoKc3VtbWFyeShyX2QyXzc5X3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCkKYGBgCgpgYGB7cn0KIyByX2QyXzc5X3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyAoMSB8IGNoYXJhY3RlciksCiMgICBkYXRhID0gZDJfNzlfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJIRUFSVCAtIE1JTkQiKSwKIyAgIGNvbnRyYXN0cyA9IGxpc3QoY2hhcmFjdGVyID0gY29udHJhc3RzX3N1bV9lZGdlKSwKIyAgIGNvcmVzID0gNCwgY29udHJvbCA9IGxpc3QoYWRhcHRfZGVsdGEgPSAwLjk5OSkpCgojIHJfZDJfNzlfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCA8LSBsbWVyKAojICAgZGlmZiB+IDEgKyAoMSB8IGNoYXJhY3RlciksCiMgICBkYXRhID0gZDJfNzlfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJIRUFSVCAtIE1JTkQiKSwKIyAgIGNvbnRyYXN0cyA9IGxpc3QoY2hhcmFjdGVyID0gY29udHJhc3RzX3N1bV9lZGdlKSkKCnJfZDJfNzlfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCA8LSBsbSgKICBkaWZmIH4gMSArIGNoYXJhY3RlciwKICBkYXRhID0gZDJfNzlfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJIRUFSVCAtIE1JTkQiKSwKICBjb250cmFzdHMgPSBsaXN0KGNoYXJhY3RlciA9IGNvbnRyYXN0c19zdW1fZWRnZSkpCgojIHJfZDJfNzlfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCA8LSBsbSgKIyAgIGRpZmYgfiAxLAojICAgZGF0YSA9IGQyXzc5X3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiSEVBUlQgLSBNSU5EIikpCgpzdW1tYXJ5KHJfZDJfNzlfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCkKYGBgCgpYWAoKIyMjIyMjIERldmVsb3BtZW50YWwgY29tcGFyaXNvbgoKYGBge3J9CiMgcl9kMl9hZDc5X3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyBhZ2VfZ3JvdXAgKyAoMSB8IGNoYXJhY3RlciksCiMgICBkYXRhID0gZDJfYWRfc2NvcmVkX2FkX2RpZmYgJT4lCiMgICAgIGZ1bGxfam9pbihkMl83OV9zY29yZWRfYWRfZGlmZikgJT4lCiMgICAgIGZpbHRlcihwYWlyID09ICJCT0RZIC0gSEVBUlQiKSwKIyAgIGNvbnRyYXN0cyA9IGxpc3QoY2hhcmFjdGVyID0gY29udHJhc3RzX3N1bV9lZGdlLAojICAgICAgICAgICAgICAgICAgICBhZ2VfZ3JvdXAgPSBjb250cmFzdHNfZHVtMl9hZ2VncCksCiMgICBjb3JlcyA9IDQsIGNvbnRyb2wgPSBsaXN0KGFkYXB0X2RlbHRhID0gMC45OTkpKQoKIyByX2QyX2FkNzlfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCA8LSBsbWVyKAojICAgZGlmZiB+IDEgKyBhZ2VfZ3JvdXAgKyAoMSB8IGNoYXJhY3RlciksCiMgICBkYXRhID0gZDJfYWRfc2NvcmVkX2FkX2RpZmYgJT4lCiMgICAgIGZ1bGxfam9pbihkMl83OV9zY29yZWRfYWRfZGlmZikgJT4lCiMgICAgIGZpbHRlcihwYWlyID09ICJCT0RZIC0gSEVBUlQiKSwKIyAgIGNvbnRyYXN0cyA9IGxpc3QoY2hhcmFjdGVyID0gY29udHJhc3RzX3N1bV9lZGdlLAojICAgICAgICAgICAgICAgICAgICBhZ2VfZ3JvdXAgPSBjb250cmFzdHNfZHVtMl9hZ2VncCkpCgpyX2QyX2FkNzlfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCA8LSBsbSgKICBkaWZmIH4gMSArIGNoYXJhY3RlciAqIGFnZV9ncm91cCwKICBkYXRhID0gZDJfYWRfc2NvcmVkX2FkX2RpZmYgJT4lIAogICAgZnVsbF9qb2luKGQyXzc5X3Njb3JlZF9hZF9kaWZmKSAlPiUKICAgIGZpbHRlcihwYWlyID09ICJCT0RZIC0gSEVBUlQiKSwKICBjb250cmFzdHMgPSBsaXN0KGNoYXJhY3RlciA9IGNvbnRyYXN0c19zdW1fZWRnZSwKICAgICAgICAgICAgICAgICAgIGFnZV9ncm91cCA9IGNvbnRyYXN0c19kdW0yX2FnZWdwKSkKCiMgcl9kMl9hZDc5X3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQgPC0gbG0oCiMgICBkaWZmIH4gMSArIGFnZV9ncm91cCwKIyAgIGRhdGEgPSBkMl9hZF9zY29yZWRfYWRfZGlmZiAlPiUKIyAgICAgZnVsbF9qb2luKGQyXzc5X3Njb3JlZF9hZF9kaWZmKSAlPiUKIyAgICAgZmlsdGVyKHBhaXIgPT0gIkJPRFkgLSBIRUFSVCIpLAojICAgY29udHJhc3RzID0gbGlzdChhZ2VfZ3JvdXAgPSBjb250cmFzdHNfZHVtMl9hZ2VncCkpCgpzdW1tYXJ5KHJfZDJfYWQ3OV9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUKQpgYGAKCmBgYHtyfQojIHJfZDJfYWQ3OV9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyBhZ2VfZ3JvdXAgKyAoMSB8IGNoYXJhY3RlciksCiMgICBkYXRhID0gZDJfYWRfc2NvcmVkX2FkX2RpZmYgJT4lCiMgICAgIGZ1bGxfam9pbihkMl83OV9zY29yZWRfYWRfZGlmZikgJT4lCiMgICAgIGZpbHRlcihwYWlyID09ICJCT0RZIC0gTUlORCIpLAojICAgY29udHJhc3RzID0gbGlzdChjaGFyYWN0ZXIgPSBjb250cmFzdHNfc3VtX2VkZ2UsCiMgICAgICAgICAgICAgICAgICAgIGFnZV9ncm91cCA9IGNvbnRyYXN0c19kdW0yX2FnZWdwKSwKIyAgIGNvcmVzID0gNCwgY29udHJvbCA9IGxpc3QoYWRhcHRfZGVsdGEgPSAwLjk5OSkpCgojIHJfZDJfYWQ3OV9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQgPC0gbG1lcigKIyAgIGRpZmYgfiAxICsgYWdlX2dyb3VwICsgKDEgfCBjaGFyYWN0ZXIpLAojICAgZGF0YSA9IGQyX2FkX3Njb3JlZF9hZF9kaWZmICU+JQojICAgICBmdWxsX2pvaW4oZDJfNzlfc2NvcmVkX2FkX2RpZmYpICU+JQojICAgICBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIE1JTkQiKSwKIyAgIGNvbnRyYXN0cyA9IGxpc3QoY2hhcmFjdGVyID0gY29udHJhc3RzX3N1bV9lZGdlLAojICAgICAgICAgICAgICAgICAgICBhZ2VfZ3JvdXAgPSBjb250cmFzdHNfZHVtMl9hZ2VncCkpCgpyX2QyX2FkNzlfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIDwtIGxtKAogIGRpZmYgfiAxICsgY2hhcmFjdGVyICogYWdlX2dyb3VwLAogIGRhdGEgPSBkMl9hZF9zY29yZWRfYWRfZGlmZiAlPiUgCiAgICBmdWxsX2pvaW4oZDJfNzlfc2NvcmVkX2FkX2RpZmYpICU+JQogICAgZmlsdGVyKHBhaXIgPT0gIkJPRFkgLSBNSU5EIiksCiAgY29udHJhc3RzID0gbGlzdChjaGFyYWN0ZXIgPSBjb250cmFzdHNfc3VtX2VkZ2UsCiAgICAgICAgICAgICAgICAgICBhZ2VfZ3JvdXAgPSBjb250cmFzdHNfZHVtMl9hZ2VncCkpCgojIHJfZDJfYWQ3OV9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQgPC0gbG0oCiMgICBkaWZmIH4gMSArIGFnZV9ncm91cCwKIyAgIGRhdGEgPSBkMl9hZF9zY29yZWRfYWRfZGlmZiAlPiUKIyAgICAgZnVsbF9qb2luKGQyXzc5X3Njb3JlZF9hZF9kaWZmKSAlPiUKIyAgICAgZmlsdGVyKHBhaXIgPT0gIkJPRFkgLSBNSU5EIiksCiMgICBjb250cmFzdHMgPSBsaXN0KGFnZV9ncm91cCA9IGNvbnRyYXN0c19kdW0yX2FnZWdwKSkKCnN1bW1hcnkocl9kMl9hZDc5X3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCkKYGBgCgpgYGB7cn0KIyByX2QyX2FkNzlfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCA8LSBicm0oCiMgICBkaWZmIH4gMSArIGFnZV9ncm91cCArICgxIHwgY2hhcmFjdGVyKSwKIyAgIGRhdGEgPSBkMl9hZF9zY29yZWRfYWRfZGlmZiAlPiUKIyAgICAgZnVsbF9qb2luKGQyXzc5X3Njb3JlZF9hZF9kaWZmKSAlPiUKIyAgICAgZmlsdGVyKHBhaXIgPT0gIkhFQVJUIC0gTUlORCIpLAojICAgY29udHJhc3RzID0gbGlzdChjaGFyYWN0ZXIgPSBjb250cmFzdHNfc3VtX2VkZ2UsCiMgICAgICAgICAgICAgICAgICAgIGFnZV9ncm91cCA9IGNvbnRyYXN0c19kdW0yX2FnZWdwKSwKIyAgIGNvcmVzID0gNCwgY29udHJvbCA9IGxpc3QoYWRhcHRfZGVsdGEgPSAwLjk5OSkpCgojIHJfZDJfYWQ3OV9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EIDwtIGxtZXIoCiMgICBkaWZmIH4gMSArIGFnZV9ncm91cCArICgxIHwgY2hhcmFjdGVyKSwKIyAgIGRhdGEgPSBkMl9hZF9zY29yZWRfYWRfZGlmZiAlPiUKIyAgICAgZnVsbF9qb2luKGQyXzc5X3Njb3JlZF9hZF9kaWZmKSAlPiUKIyAgICAgZmlsdGVyKHBhaXIgPT0gIkhFQVJUIC0gTUlORCIpLAojICAgY29udHJhc3RzID0gbGlzdChjaGFyYWN0ZXIgPSBjb250cmFzdHNfc3VtX2VkZ2UsCiMgICAgICAgICAgICAgICAgICAgIGFnZV9ncm91cCA9IGNvbnRyYXN0c19kdW0yX2FnZWdwKSkKCnJfZDJfYWQ3OV9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EIDwtIGxtKAogIGRpZmYgfiAxICsgY2hhcmFjdGVyICogYWdlX2dyb3VwLAogIGRhdGEgPSBkMl9hZF9zY29yZWRfYWRfZGlmZiAlPiUgCiAgICBmdWxsX2pvaW4oZDJfNzlfc2NvcmVkX2FkX2RpZmYpICU+JQogICAgZmlsdGVyKHBhaXIgPT0gIkhFQVJUIC0gTUlORCIpLAogIGNvbnRyYXN0cyA9IGxpc3QoY2hhcmFjdGVyID0gY29udHJhc3RzX3N1bV9lZGdlLAogICAgICAgICAgICAgICAgICAgYWdlX2dyb3VwID0gY29udHJhc3RzX2R1bTJfYWdlZ3ApKQoKIyByX2QyX2FkNzlfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCA8LSBsbSgKIyAgIGRpZmYgfiAxICsgYWdlX2dyb3VwLAojICAgZGF0YSA9IGQyX2FkX3Njb3JlZF9hZF9kaWZmICU+JQojICAgICBmdWxsX2pvaW4oZDJfNzlfc2NvcmVkX2FkX2RpZmYpICU+JQojICAgICBmaWx0ZXIocGFpciA9PSAiSEVBUlQgLSBNSU5EIiksCiMgICBjb250cmFzdHMgPSBsaXN0KGFnZV9ncm91cCA9IGNvbnRyYXN0c19kdW0yX2FnZWdwKSkKCnN1bW1hcnkocl9kMl9hZDc5X3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQpCmBgYAoKWFgKCiMjIyMjIFVzaW5nIGNoaWxkcmVuJ3Mgb3duIHNjYWxlcwoKYGBge3J9CnBsb3RfZDJfNzlfc2NvcmVkXzc5X2RpZmYgPC0gZGlmZnBsb3RfZnVuKGQyXzc5X3Njb3JlZF83OV9kaWZmLCBjb2xvcnMwMikKYGBgCgpgYGB7cn0KIyByX2QyXzc5X3Njb3JlZF83OV9kaWZmX0JPRFlfSEVBUlQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyAoMSB8IGNoYXJhY3RlciksCiMgICBkYXRhID0gZDJfNzlfc2NvcmVkXzc5X2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gSEVBUlQiKSwKIyAgIGNvbnRyYXN0cyA9IGxpc3QoY2hhcmFjdGVyID0gY29udHJhc3RzX3N1bV9lZGdlKSwKIyAgIGNvcmVzID0gNCwgY29udHJvbCA9IGxpc3QoYWRhcHRfZGVsdGEgPSAwLjk5OSkpCgojIHJfZDJfNzlfc2NvcmVkXzc5X2RpZmZfQk9EWV9IRUFSVCA8LSBsbWVyKAojICAgZGlmZiB+IDEgKyAoMSB8IGNoYXJhY3RlciksCiMgICBkYXRhID0gZDJfNzlfc2NvcmVkXzc5X2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gSEVBUlQiKSwKIyAgIGNvbnRyYXN0cyA9IGxpc3QoY2hhcmFjdGVyID0gY29udHJhc3RzX3N1bV9lZGdlKSkKCnJfZDJfNzlfc2NvcmVkXzc5X2RpZmZfQk9EWV9IRUFSVCA8LSBsbSgKICBkaWZmIH4gMSArIGNoYXJhY3RlciwKICBkYXRhID0gZDJfNzlfc2NvcmVkXzc5X2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gSEVBUlQiKSwKICBjb250cmFzdHMgPSBsaXN0KGNoYXJhY3RlciA9IGNvbnRyYXN0c19zdW1fZWRnZSkpCgojIHJfZDJfNzlfc2NvcmVkXzc5X2RpZmZfQk9EWV9IRUFSVCA8LSBsbSgKIyAgIGRpZmYgfiAxLAojICAgZGF0YSA9IGQyXzc5X3Njb3JlZF83OV9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIEhFQVJUIikpCgpzdW1tYXJ5KHJfZDJfNzlfc2NvcmVkXzc5X2RpZmZfQk9EWV9IRUFSVCkKYGBgCgpgYGB7cn0KIyByX2QyXzc5X3Njb3JlZF83OV9kaWZmX0JPRFlfTUlORCA8LSBicm0oCiMgICBkaWZmIH4gMSArICgxIHwgY2hhcmFjdGVyKSwKIyAgIGRhdGEgPSBkMl83OV9zY29yZWRfNzlfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFkgLSBNSU5EIiksCiMgICBjb250cmFzdHMgPSBsaXN0KGNoYXJhY3RlciA9IGNvbnRyYXN0c19zdW1fZWRnZSksCiMgICBjb3JlcyA9IDQsIGNvbnRyb2wgPSBsaXN0KGFkYXB0X2RlbHRhID0gMC45OTkpKQoKIyByX2QyXzc5X3Njb3JlZF83OV9kaWZmX0JPRFlfTUlORCA8LSBsbWVyKAojICAgZGlmZiB+IDEgKyAoMSB8IGNoYXJhY3RlciksCiMgICBkYXRhID0gZDJfNzlfc2NvcmVkXzc5X2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gTUlORCIpLAojICAgY29udHJhc3RzID0gbGlzdChjaGFyYWN0ZXIgPSBjb250cmFzdHNfc3VtX2VkZ2UpKQoKcl9kMl83OV9zY29yZWRfNzlfZGlmZl9CT0RZX01JTkQgPC0gbG0oCiAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIsCiAgZGF0YSA9IGQyXzc5X3Njb3JlZF83OV9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIE1JTkQiKSwKICBjb250cmFzdHMgPSBsaXN0KGNoYXJhY3RlciA9IGNvbnRyYXN0c19zdW1fZWRnZSkpCgojIHJfZDJfNzlfc2NvcmVkXzc5X2RpZmZfQk9EWV9NSU5EIDwtIGxtKAojICAgZGlmZiB+IDEsCiMgICBkYXRhID0gZDJfNzlfc2NvcmVkXzc5X2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gTUlORCIpKQoKc3VtbWFyeShyX2QyXzc5X3Njb3JlZF83OV9kaWZmX0JPRFlfTUlORCkKYGBgCgpgYGB7cn0KIyByX2QyXzc5X3Njb3JlZF83OV9kaWZmX0hFQVJUX01JTkQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyAoMSB8IGNoYXJhY3RlciksCiMgICBkYXRhID0gZDJfNzlfc2NvcmVkXzc5X2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJIRUFSVCAtIE1JTkQiKSwKIyAgIGNvbnRyYXN0cyA9IGxpc3QoY2hhcmFjdGVyID0gY29udHJhc3RzX3N1bV9lZGdlKSwKIyAgIGNvcmVzID0gNCwgY29udHJvbCA9IGxpc3QoYWRhcHRfZGVsdGEgPSAwLjk5OSkpCgojIHJfZDJfNzlfc2NvcmVkXzc5X2RpZmZfSEVBUlRfTUlORCA8LSBsbWVyKAojICAgZGlmZiB+IDEgKyAoMSB8IGNoYXJhY3RlciksCiMgICBkYXRhID0gZDJfNzlfc2NvcmVkXzc5X2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJIRUFSVCAtIE1JTkQiKSwKIyAgIGNvbnRyYXN0cyA9IGxpc3QoY2hhcmFjdGVyID0gY29udHJhc3RzX3N1bV9lZGdlKSkKCnJfZDJfNzlfc2NvcmVkXzc5X2RpZmZfSEVBUlRfTUlORCA8LSBsbSgKICBkaWZmIH4gMSArIGNoYXJhY3RlciwKICBkYXRhID0gZDJfNzlfc2NvcmVkXzc5X2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJIRUFSVCAtIE1JTkQiKSwKICBjb250cmFzdHMgPSBsaXN0KGNoYXJhY3RlciA9IGNvbnRyYXN0c19zdW1fZWRnZSkpCgojIHJfZDJfNzlfc2NvcmVkXzc5X2RpZmZfSEVBUlRfTUlORCA8LSBsbSgKIyAgIGRpZmYgfiAxLAojICAgZGF0YSA9IGQyXzc5X3Njb3JlZF83OV9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiSEVBUlQgLSBNSU5EIikpCgpzdW1tYXJ5KHJfZDJfNzlfc2NvcmVkXzc5X2RpZmZfSEVBUlRfTUlORCkKYGBgCgpYWAoKIyMgRGlzY3Vzc2lvbgoKWFgKCmBgYHtyfQpzY2FsZXNfc3R1ZHkyIDwtIGJpbmRfcm93cyhzY2FsZXNfZWZhX3dkbV9kMl9hZCAlPiUgbXV0YXRlKHN0dWR5ID0gIkFkdWx0cyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZXNfZWZhX3dkbV9kMl83OSAlPiUgbXV0YXRlKHN0dWR5ID0gIkNoaWxkcmVuLCA3LTl5IikpICU+JQogIHNlbGVjdCgtYyhsb2FkaW5nLCBvcmRlcikpICU+JQogIGRpc3RpbmN0KCkgJT4lCiAgc3ByZWFkKHN0dWR5LCBmYWN0b3IpICU+JQogIG11dGF0ZSh1cl9mYWN0b3IgPSBpZmVsc2UoIWlzLm5hKGBBZHVsdHNgKSwgYEFkdWx0c2AsIGBDaGlsZHJlbiwgNy05eWApKSAlPiUKICBsZWZ0X2pvaW4oc2NhbGVzX2VmYV93ZG1fZDJfYWQgJT4lIAogICAgICAgICAgICAgIHNlbGVjdChjYXBhY2l0eSwgb3JkZXIpICU+JSByZW5hbWUob3JkZXJfYWQgPSBvcmRlcikpICU+JQogIGxlZnRfam9pbihzY2FsZXNfZWZhX3dkbV9kMl83OSAlPiUgCiAgICAgICAgICAgICAgc2VsZWN0KGNhcGFjaXR5LCBvcmRlcikgJT4lIHJlbmFtZShvcmRlcl83OSA9IG9yZGVyKSkgJT4lCiAgYXJyYW5nZSh1cl9mYWN0b3IsIG9yZGVyX2FkLCBvcmRlcl83OSkgJT4lCiAgc2VsZWN0KC1jKHVyX2ZhY3Rvciwgc3RhcnRzX3dpdGgoIm9yZGVyIikpKQpgYGAKCmBgYHtyfQp0YWJsZTQuMiA8LSBzY2FsZXNfc3R1ZHkyICU+JQogIG11dGF0ZV9hdCh2YXJzKC1jYXBhY2l0eSksCiAgICAgICAgICAgIGZ1bnMoaWZlbHNlKGlzLm5hKC4pLCAiIiwgIuKckyIpKSkgJT4lCiAgcmVuYW1lKENhcGFjaXR5ID0gY2FwYWNpdHkpICU+JQogIGthYmxlKGZvcm1hdCA9ICJodG1sIiwKICAgICAgICBjYXB0aW9uID0gIlRhYmxlIDQuMjogU2NhbGVzIGZvciBlYWNoIG9mIHRoZSBjb25jZXB0dWFsIHVuaXRzIChmYWN0b3JzKSBpZGVudGlmaWVkIGJ5IEVGQSBmb3IgVVMgQWR1bHRzIGFuZCBjaGlsZHJlbiBpbiBTdHVkeSAyIChzZWUgQ2hhcHRlciBJSUkpLiBBIGNoZWNrbWFyayBpbmRpY2F0ZXMgdGhhdCBhIG1lbnRhbCBjYXBhY2l0eSB3YXMgaW5jbHVkZWQgaW4gYSBzY2FsZSBmb3IgYSBwYXJ0aWN1bGFyIHNhbXBsZS4iKSAlPiUKICBrYWJsZV9zdHlsaW5nKCkgJT4lCiAgZ3JvdXBfcm93cygiQk9EWSBzY2FsZSIsIDEsIDcpICU+JQogIGdyb3VwX3Jvd3MoIkhFQVJUIHNjYWxlIiwgOCwgMTQpICU+JQogIGdyb3VwX3Jvd3MoIk1JTkQgc2NhbGUiLCAxNSwgMjMpCmBgYAoKYGBge3IgdGFibGU0LjIsIGluY2x1ZGUgPSBUfQp0YWJsZTQuMgpgYGAKCmBgYHtyfQpmaWd1cmU0LjMgPC0gcGxvdF9ncmlkKGZpZ19kMl9hZF9wbG90c19sZWdfdGl0bGUsIAogICAgICAgICAgICAgICAgICAgICAgIGZpZ19kMl83OV9zY29yZWRfYWRfcGxvdHNfbGVnX3RpdGxlLAogICAgICAgICAgICAgICAgICAgICAgIGZpZ19kMl9hbGxfc2NvcmVkX2FkX3Bsb3RzX2xlZ190aXRsZSwKICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSkKCmZpZ3VyZTQuM19jYXAgPC0gYWRkX3N1YihmaWd1cmU0LjMsIHN0cl93cmFwKCJGaWd1cmUgNC4zOiBSZWxhdGlvbnNoaXBzIGFtb25nIFVTIGFkdWx0cycsIG9sZGVyIGNoaWxkcmVuJ3MsIGFuZCB5b3VuZ2VyIGNoaWxkcmVuJ3MgYXR0cmlidXRpb25zIG9mIGNvbmNlcHR1YWwgdW5pdHMgaW4gU3R1ZHkgMiwgc2NvcmVkIHVzaW5nIGFkdWx0cycgQk9EWSwgSEVBUlQsIGFuZCBNSU5EIHNjYWxlcyAoc2VlIFRhYmxlIDQuMikuIFBsb3RzIGFyZSBvcmdhbml6ZWQgYnkgc2FtcGxlIChyb3dzKSBhbmQgYnkgcGFpciBvZiBjb25jZXB0dWFsIHVuaXRzIChjb2x1bW5zKS4gKEEpIEFkdWx0cy4gKEIpIENoaWxkcmVuICg3LTl5IG9mIGFnZSksIHNjb3JlZCB1c2luZyBhZHVsdHMnIHNjYWxlcy4gKEMpIEEgdmlzdWFsaXphdGlvbiBvZiBkZXZlbG9wbWVudCBiZXR3ZWVuIDctOXkgYW5kIGFkdWx0aG9vZCwgdXNpbmcgbWVhbiBzY29yZXMgYnkgY2hhcmFjdGVyIGFuZCBhZ2UgZ3JvdXAuIEZvciBlYWNoIGNvbmNlcHR1YWwgdW5pdCwgc2NvcmVzIGNvdWxkIHJhbmdlIGZyb20gMC0xLiBJbiBwYW5lbHMgQS1CLCBpbmRpdmlkdWFsIHBhcnRpY2lwYW50cyBhcmUgcGxvdHRlZCBhcyBzbWFsbCwgdHJhbnNsdWNlbnQgY2lyY2xlcywgYW5kIG1lYW4gc2NvcmVzIGJ5IGNoYXJhY3RlciBhcmUgcGxvdHRlZCBhcyBsYXJnZXIsIHNvbGlkIGRpYW1vbmRzLiBFcnJvciBiYXJzIGFyZSA5NSUgYm9vdHN0cmFwcGVkIGNvbmZpZGVuY2UgaW50ZXJ2YWxzLiBUaGUgZG90dGVkIGxpbmUgY29ycmVzcG9uZHMgdG8gZXF1YWwgZW5kb3JzZW1lbnRzIG9mIHRoZSB0d28gY29uY2VwdHVhbCB1bml0cyBwbG90dGVkLiIsIDExMCksIHggPSAwLCBoanVzdCA9IDApCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBULCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMS40fQpnZ2RyYXcoZmlndXJlNC4zX2NhcCkKYGBgCgpgYGB7cn0KZmlndXJlNC40IDwtIHBsb3RfZ3JpZChmaWdfZDJfNzlfc2NvcmVkXzc5X3Bsb3RzX2xlZ190aXRsZSwgCiAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEpCgpmaWd1cmU0LjRfY2FwIDwtIGFkZF9zdWIoZmlndXJlNC40LCBzdHJfd3JhcCgiRmlndXJlIDQuNDogUmVsYXRpb25zaGlwcyBhbW9uZyBjaGlsZHJlbidzIGF0dHJpYnV0aW9ucyBvZiBjb25jZXB0dWFsIHVuaXRzIGluIFN0dWR5IDIsIHNjb3JlZCB1c2luZyB0aGVpciBvd24gc2NhbGVzIChzZWUgVGFibGUgNC4yKS4gUGxvdHMgYXJlIG9yZ2FuaXplZCBieSBwYWlyIG9mIGNvbmNlcHR1YWwgdW5pdHMgKGNvbHVtbnMpLiBGb3IgZWFjaCBjb25jZXB0dWFsIHVuaXQsIHNjb3JlcyBjb3VsZCByYW5nZSBmcm9tIDAtMS4gSW5kaXZpZHVhbCBwYXJ0aWNpcGFudHMgYXJlIHBsb3R0ZWQgYXMgc21hbGwsIHRyYW5zbHVjZW50IGNpcmNsZXMsIGFuZCBtZWFuIHNjb3JlcyBieSBjaGFyYWN0ZXIgYXJlIHBsb3R0ZWQgYXMgbGFyZ2VyLCBzb2xpZCBkaWFtb25kcy4gRXJyb3IgYmFycyBhcmUgOTUlIGJvb3RzdHJhcHBlZCBjb25maWRlbmNlIGludGVydmFscy4gVGhlIGRvdHRlZCBsaW5lIGNvcnJlc3BvbmRzIHRvIGVxdWFsIGVuZG9yc2VtZW50cyBvZiB0aGUgdHdvIGNvbmNlcHR1YWwgdW5pdHMgcGxvdHRlZC4iLCAxMTApLCB4ID0gMCwgaGp1c3QgPSAwKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gVCwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDAuNX0KZ2dkcmF3KGZpZ3VyZTQuNF9jYXApCmBgYAoKYGBge3J9CmZpZ3VyZTQuNV9wbG90cyA8LSBwbG90X2dyaWQoCiAgcGxvdF9kMl9hZF9zY29yZWRfYWRfZGlmZiArCiAgICBsYWJzKHRpdGxlID0gIlN0dWR5IDI6IEFkdWx0cyIpICsKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSwKICBwbG90X2QyXzc5X3Njb3JlZF9hZF9kaWZmICsKICAgIGxhYnModGl0bGUgPSAiU3R1ZHkgMjogQ2hpbGRyZW4sIDctOXkgKHNjb3JlZCB1c2luZyBhZHVsdHMnIHNjYWxlcykiKSArCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiksCiAgcGxvdF9kMl83OV9zY29yZWRfNzlfZGlmZiArIAogICAgbGFicyh0aXRsZSA9ICJTdHVkeSAyOiBDaGlsZHJlbiwgNC02eSAoc2NvcmVkIHVzaW5nIHRoZWlyIG93biBzY2FsZXMpIikgKwogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpLCAKICBuY29sID0gMywgcmVsX3dpZHRocyA9IGMoMSwgMSwgMSksCiAgbGFiZWxzID0gIkFVVE8iKQoKZmlndXJlNC41X2NhcCA8LSBhZGRfc3ViKGZpZ3VyZTQuNV9wbG90cywgc3RyX3dyYXAoIkZpZ3VyZSA0LjU6IERpZmZlcmVuY2Ugc2NvcmVzIGJldHdlZW4gVVMgYWR1bHRzJyBhbmQgY2hpbGRyZW4ncyBhdHRyaWJ1dGlvbnMgb2YgY29uY2VwdHVhbCB1bml0cyBpbiBTdHVkeSAyLiB0aGlzIGluY2x1ZGVzIGRpZmZlcmVuY2Ugc2NvcmVzIHVzaW5nIGFkdWx0cycgQk9EWSwgSEVBUlQsIGFuZCBNSU5EIHNjYWxlcyAocGFuZWwgQikgYW5kIGRpZmZlcmVuY2Ugc2NvcmVzIHVzaW5nIGNoaWxkcmVuJ3Mgb3duIHNjYWxlcyAocGFuZWwgQzsgc2VlIFRhYmxlIDQuMikuIEZvciBlYWNoIGNvbmNlcHR1YWwgdW5pdCwgc2NvcmVzIGNvdWxkIHJhbmdlIGZyb20gMC0xLCBzdWNoIHRoYXQgZGlmZmVyZW5jZSBzY29yZXMgY291bGQgcmFuZ2UgZnJvbSAtMSB0byArMS4gSW5kaXZpZHVhbCBwYXJ0aWNpcGFudHMgYXJlIHBsb3R0ZWQgYXMgc21hbGwsIHRyYW5zbHVjZW50IGNpcmNsZXMsIGFuZCBtZWFuIGRpZmZlcmVuY2Ugc2NvcmVzIGJ5IGNoYXJhY3RlciBhcmUgcGxvdHRlZCBhcyBsYXJnZXIsIHNvbGlkIGRpYW1vbmRzLiBFcnJvciBiYXJzIGFyZSA5NSUgYm9vdHN0cmFwcGVkIGNvbmZpZGVuY2UgaW50ZXJ2YWxzLiBUaGUgZG90dGVkIGxpbmUgY29ycmVzcG9uZHMgdG8gZXF1YWwgZW5kb3JzZW1lbnRzIG9mIHRoZSB0d28gY29uY2VwdHVhbCB1bml0cyBwbG90dGVkIChpLmUuLCBhIGRpZmZlcmVuY2Ugc2NvcmUgb2YgMCkuIiwgMTgwKSwgeCA9IDAsIGhqdXN0ID0gMCkKYGBgCgpgYGB7ciwgaW5jbHVkZSA9IFQsIGZpZy53aWR0aCA9IDgsIGZpZy5hc3AgPSAwLjM4fQpnZ2RyYXcoZmlndXJlNC41X2NhcCkKYGBgCgojIFN0dWR5IDM6IENvbmNlcHR1YWwgY2hhbmdlIG92ZXIgZWFybHkgYW5kIG1pZGRsZSBjaGlsZGhvb2QgKDQtOXkpCgpJbiBTdHVkeSAzLCBgciBucm93KGQzX2FkX3dpZGUpYCBVUyBhZHVsdHMsIGByIG5yb3coZDNfNzlfd2lkZSlgICJvbGRlciIgY2hpbGRyZW4gKGByIHN1bW1hcnkoZDNfNzkkYWdlKVsiTWluLiJdICU+JSByb3VuZCgyKWAtYHIgc3VtbWFyeShkM183OSRhZ2UpWyJNYXguIl0gJT4lIHJvdW5kKDIpYCB5ZWFyczsgbWVkaWFuOiBgciBzdW1tYXJ5KGQzXzc5JGFnZSlbIk1lZGlhbiJdICU+JSByb3VuZCgyKWB5KSwgYW5kIGByIG5yb3coZDNfNDZfd2lkZSlgICJ5b3VuZ2VyIiBjaGlsZHJlbiAoYHIgc3VtbWFyeShkM180NiRhZ2UpWyJNaW4uIl0gJT4lIHJvdW5kKDIpYC1gciBzdW1tYXJ5KGQzXzQ2JGFnZSlbIk1heC4iXSAlPiUgcm91bmQoMilgIHllYXJzOyBtZWRpYW46IGByIHN1bW1hcnkoZDNfNDYkYWdlKVsiTWVkaWFuIl0gJT4lIHJvdW5kKDIpYHkpIGVhY2ggYXNzZXNzZWQgYSBzaW5nbGUgdGFyZ2V0IGNoYXJhY3RlciBvbiAyMCBtZW50YWwgY2FwYWNpdGllcy4gVG8gbWFrZSB0aGUgc3R1ZHkgYXBwcm9wcmlhdGUgZm9yIGNoaWxkcmVuIGluIHRoaXMgYWdlIHJhbmdlLCBwYXJ0aWNpcGFudHMgYXNzZXNzZWQgYSBzdWJzZXQgb2YgdGhlIDQwIG1lbnRhbCBjYXBhY2l0aWVzIGVtcGxveWVkIGluIFN0dWR5IDIsIGNob3NlbiB0byByZXByZXNlbnQgdGhlIHRocmVlICJjb25jZXB0dWFsIHVuaXRzIiByZXZlYWxlZCBieSBTdHVkaWVzIDEtMiAoQk9EWSwgSEVBUlQsIGFuZCBNSU5EKSBhbmQgdG8gY292ZXIgYSBzaW1pbGFyIHJhbmdlIG9mIG1lbnRhbCBjYXBhY2l0aWVzIGFzIFN0dWRpZXMgMS0yLiBBcyBpbiBTdHVkeSAyLCBwYXJ0aWNpcGFudHMgcmVzcG9uZGVkIG9uIGEgMy1wb2ludCBzY2FsZSAoIm5vLCIgY29kZWQgYXMgMDsgImtpbmRhLCIgY29kZWQgYXMgMC41LCAieWVzLCIgY29kZWQgYXMgMSkuIFRoaXMgc3R1ZHkgZW1wbG95ZWQgdGhlICJkaXZlcnNlIGNoYXJhY3RlcnMiIHZhcmlhbnQgb2YgdGhlIGdlbmVyYWwgYXBwcm9hY2gsIHdpdGggcGFydGljaXBhbnRzIHJhbmRvbWx5IG9yIHBzZXVkby1yYW5kb21seSBhc3NpZ25lZCB0byBhc3Nlc3MgZWl0aGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIDkgY2hhcmFjdGVyczogYW4gZWxlcGhhbnQsIGEgZ29hdCwgYSBtb3VzZSwgYSBiaXJkLCBhIGJlZXRsZSwgYSB0ZWRkeSBiZWFyLCBhIGRvbGwsIGEgcm9ib3QsIG9yIGEgY29tcHV0ZXIuIChTZWUgQ2hhcHRlciBJSSBmb3IgZGV0YWlsZWQgbWV0aG9kcy4pCgojIyBTcGVjaWFsIG5vdGVzIG9uIGRhdGEgcHJvY2Vzc2luZyBhbmQgYW5hbHlzaXMKCiMjIFJlc3VsdHMKCiMjIyBBZHVsdHMKCiMjIyMgU2NhbGUgY29uc3RydWN0aW9uCgpgYGB7cn0Kc2NhbGVzX2VmYV93ZG1fZDNfYWQgPC0gc2NhbGVfZnVuKGVmYV93ZG1fZDNfYWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9uYW1lcyA9IGZhY3Rvcl9uYW1lc19lZmFfd2RtX2QzX2FkKQpkM19hZF9zY29yZWRfYWQgPC0gc2NvcmVfZnVuKGQzX2FkLCBzY2FsZXNfZWZhX3dkbV9kM19hZCkKCnNhdmVSRFMoc2NhbGVzX2VmYV93ZG1fZDNfYWQsIGZpbGUgPSAiLi9zY2FsZXMvc2NhbGVzX2VmYV93ZG1fZDNfYWQiKQpzYXZlUkRTKGQzX2FkX3Njb3JlZF9hZCwgZmlsZSA9ICIuL3Njb3JlZF9kYXRhL2QzX2FkX3Njb3JlZF9hZCIpCmBgYAoKRm9sbG93aW5nIHRoZSBzdGVwcyBkZXNjcmliZWQgaW4gIkdlbmVyYWwgYW5hbHlzaXMgcGxhbiwiIGFib3ZlLCB5aWVsZGVkIGByIGZhY3RfbmFtZV9mdW4oZmFjdG9yX25hbWVzX2VmYV93ZG1fZDNfYWQpYCBzY2FsZXMgb2YgYHIgc2NhbGVzX2VmYV93ZG1fZDNfYWQgJT4lIGNvdW50KGZhY3RvcikgJT4lIHN1bW1hcmlzZShtZWFuID0gbWVhbihuKSkgJT4lIHNlbGVjdChtZWFuKSAlPiUgYXMubnVtZXJpYygpYCBpdGVtcyBlYWNoOyBzZWUgVGFibGUgNC4zLgoKIyMjIyBWaXN1YWxpemF0aW9uCgpYWAoKYGBge3J9CnBsb3RzX2QzX2FkX3Njb3JlZF9hZCA8LSByZWx2aXpfZnVuKGQzX2FkX3Njb3JlZF9hZCwgY29sb3JzID0gY29sb3JzMDkpCmBgYAoKYGBge3J9CmZpZ19kM19hZF9wbG90cyA8LSBwbG90X2dyaWQocGxvdHNfZDNfYWRfc2NvcmVkX2FkW1sxXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdHNfZDNfYWRfc2NvcmVkX2FkW1syXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdHNfZDNfYWRfc2NvcmVkX2FkW1szXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQTEiLCAiQTIiLCAiQTMiKSwgbmNvbCA9IDMpCgpmaWdfZDNfYWRfbGVnIDwtIGdldF9sZWdlbmQoCiAgcGxvdHNfZDNfYWRfc2NvcmVkX2FkW1sxXV0gKwogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpICsKICAgIHNjYWxlX2ZpbGxfbWFudWFsKCJUYXJnZXQgY2hhcmFjdGVyIiwgCiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjb2xvcnMwOSwKICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKHRpdGxlLnBvc2l0aW9uID0gImxlZnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gImhvcml6b250YWwiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSA5KSkgKwogICAgc2NhbGVfY29sb3JfbWFudWFsKCJUYXJnZXQgY2hhcmFjdGVyIiwKICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjb2xvcnMwOSwKICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZCh0aXRsZS5wb3NpdGlvbiA9ICJsZWZ0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDkpKSkKCmZpZ19kM19hZF9wbG90c19sZWcgPC0gcGxvdF9ncmlkKGZpZ19kM19hZF9wbG90cywgZmlnX2QzX2FkX2xlZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygxLCAwLjA1KSkKCmZpZ19kM19hZF90aXRsZSA8LSBnZ2RyYXcoKSArIAogIGRyYXdfbGFiZWwoIlN0dWR5IDM6IEFkdWx0cyIsIHNpemUgPSAxNiwgZm9udGZhY2UgPSAnYm9sZCcsIHggPSAwLCBoanVzdCA9IDApCgpmaWdfZDNfYWRfcGxvdHNfbGVnX3RpdGxlIDwtIHBsb3RfZ3JpZChmaWdfZDNfYWRfdGl0bGUsIGZpZ19kM19hZF9wbG90c19sZWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMC4xMiwgMSkpCmBgYAoKIyMjIyBBbmFseXNpcyBvZiBhc3ltbWV0cmllcwoKWFgKCmBgYHtyfQpkM19hZF9zY29yZWRfYWRfZGlmZiA8LSBkaWZmX2Z1bihkM19hZF9zY29yZWRfYWQpCnNhdmVSRFMoZDNfYWRfc2NvcmVkX2FkX2RpZmYsICIuL2RpZmZzY29yZV9kYXRhL2QzX2FkX3Njb3JlZF9hZF9kaWZmIikKYGBgCgpgYGB7cn0KZDNfYWRfc2NvcmVkX2FkX2RpZmYgPC0gZGlmZl9mdW4oZDNfYWRfc2NvcmVkX2FkKQpgYGAKCmBgYHtyfQpwbG90X2QzX2FkX3Njb3JlZF9hZF9kaWZmIDwtIGRpZmZwbG90X2Z1bihkM19hZF9zY29yZWRfYWRfZGlmZiwgY29sb3JzMDkpCmBgYAoKYGBge3J9CiMgcl9kM19hZF9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUIDwtIGJybSgKIyAgIGRpZmYgfiAxICsgKDEgfCBjaGFyYWN0ZXIpLAojICAgZGF0YSA9IGQzX2FkX3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIEhFQVJUIiksCiMgICBjb250cmFzdHMgPSBsaXN0KGNoYXJhY3RlciA9IGNvbnRyYXN0c19zdW1fZHYwOSksCiMgICBjb3JlcyA9IDQsIGNvbnRyb2wgPSBsaXN0KGFkYXB0X2RlbHRhID0gMC45OTkpKQoKIyByX2QzX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQgPC0gbG1lcigKIyAgIGRpZmYgfiAxICsgKDEgfCBjaGFyYWN0ZXIpLAojICAgZGF0YSA9IGQzX2FkX3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIEhFQVJUIiksCiMgICBjb250cmFzdHMgPSBsaXN0KGNoYXJhY3RlciA9IGNvbnRyYXN0c19zdW1fZHYwOSkpCgpyX2QzX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQgPC0gbG0oCiAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIsCiAgZGF0YSA9IGQzX2FkX3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIEhFQVJUIiksCiAgY29udHJhc3RzID0gbGlzdChjaGFyYWN0ZXIgPSBjb250cmFzdHNfc3VtX2R2MDkpKQoKIyByX2QzX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQgPC0gbG0oCiMgICBkaWZmIH4gMSwKIyAgIGRhdGEgPSBkM19hZF9zY29yZWRfYWRfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFkgLSBIRUFSVCIpKQoKc3VtbWFyeShyX2QzX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQpCmBgYAoKYGBge3J9CiMgcl9kM19hZF9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyAoMSB8IGNoYXJhY3RlciksCiMgICBkYXRhID0gZDNfYWRfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gTUlORCIpLAojICAgY29udHJhc3RzID0gbGlzdChjaGFyYWN0ZXIgPSBjb250cmFzdHNfc3VtX2R2MDkpLAojICAgY29yZXMgPSA0LCBjb250cm9sID0gbGlzdChhZGFwdF9kZWx0YSA9IDAuOTk5KSkKCiMgcl9kM19hZF9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQgPC0gbG1lcigKIyAgIGRpZmYgfiAxICsgKDEgfCBjaGFyYWN0ZXIpLAojICAgZGF0YSA9IGQzX2FkX3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIE1JTkQiKSwKIyAgIGNvbnRyYXN0cyA9IGxpc3QoY2hhcmFjdGVyID0gY29udHJhc3RzX3N1bV9kdjA5KSkKCnJfZDNfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIDwtIGxtKAogIGRpZmYgfiAxICsgY2hhcmFjdGVyLAogIGRhdGEgPSBkM19hZF9zY29yZWRfYWRfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFkgLSBNSU5EIiksCiAgY29udHJhc3RzID0gbGlzdChjaGFyYWN0ZXIgPSBjb250cmFzdHNfc3VtX2R2MDkpKQoKIyByX2QzX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCA8LSBsbSgKIyAgIGRpZmYgfiAxLAojICAgZGF0YSA9IGQzX2FkX3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIE1JTkQiKSkKCnN1bW1hcnkocl9kM19hZF9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQpCmBgYAoKYGBge3J9CiMgcl9kM19hZF9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EIDwtIGJybSgKIyAgIGRpZmYgfiAxICsgKDEgfCBjaGFyYWN0ZXIpLAojICAgZGF0YSA9IGQzX2FkX3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiSEVBUlQgLSBNSU5EIiksCiMgICBjb250cmFzdHMgPSBsaXN0KGNoYXJhY3RlciA9IGNvbnRyYXN0c19zdW1fZHYwOSksCiMgICBjb3JlcyA9IDQsIGNvbnRyb2wgPSBsaXN0KGFkYXB0X2RlbHRhID0gMC45OTkpKQoKIyByX2QzX2FkX3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQgPC0gbG1lcigKIyAgIGRpZmYgfiAxICsgKDEgfCBjaGFyYWN0ZXIpLAojICAgZGF0YSA9IGQzX2FkX3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiSEVBUlQgLSBNSU5EIiksCiMgICBjb250cmFzdHMgPSBsaXN0KGNoYXJhY3RlciA9IGNvbnRyYXN0c19zdW1fZHYwOSkpCgpyX2QzX2FkX3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQgPC0gbG0oCiAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIsCiAgZGF0YSA9IGQzX2FkX3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiSEVBUlQgLSBNSU5EIiksCiAgY29udHJhc3RzID0gbGlzdChjaGFyYWN0ZXIgPSBjb250cmFzdHNfc3VtX2R2MDkpKQoKIyByX2QzX2FkX3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQgPC0gbG0oCiMgICBkaWZmIH4gMSwKIyAgIGRhdGEgPSBkM19hZF9zY29yZWRfYWRfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkhFQVJUIC0gTUlORCIpKQoKc3VtbWFyeShyX2QzX2FkX3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQpCmBgYAoKIyMjIENoaWxkcmVuICg3LTl5KQoKIyMjIyBTY2FsZSBjb25zdHJ1Y3Rpb24KCmBgYHtyfQpzY2FsZXNfZWZhX3dkbV9kM183OSA8LSBzY2FsZV9mdW4oZWZhX3dkbV9kM183OSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yX25hbWVzID0gZmFjdG9yX25hbWVzX2VmYV93ZG1fZDNfNzkpCmQzXzc5X3Njb3JlZF9hZCA8LSBzY29yZV9mdW4oZDNfNzksIHNjYWxlc19lZmFfd2RtX2QzX2FkKQpkM183OV9zY29yZWRfNzkgPC0gc2NvcmVfZnVuKGQzXzc5LCBzY2FsZXNfZWZhX3dkbV9kM183OSkKCnNhdmVSRFMoc2NhbGVzX2VmYV93ZG1fZDNfNzksIGZpbGUgPSAiLi9zY2FsZXMvc2NhbGVzX2VmYV93ZG1fZDNfNzkiKQpzYXZlUkRTKGQzXzc5X3Njb3JlZF9hZCwgZmlsZSA9ICIuL3Njb3JlZF9kYXRhL2QzXzc5X3Njb3JlZF9hZCIpCnNhdmVSRFMoZDNfNzlfc2NvcmVkXzc5LCBmaWxlID0gIi4vc2NvcmVkX2RhdGEvZDNfNzlfc2NvcmVkXzc5IikKYGBgCgpGb2xsb3dpbmcgdGhlIHN0ZXBzIGRlc2NyaWJlZCBpbiAiR2VuZXJhbCBhbmFseXNpcyBwbGFuLCIgYWJvdmUsIHlpZWxkZWQgYHIgZmFjdF9uYW1lX2Z1bihmYWN0b3JfbmFtZXNfZWZhX3dkbV9kM183OSlgIHNjYWxlcyBvZiBgciBzY2FsZXNfZWZhX3dkbV9kM183OSAlPiUgY291bnQoZmFjdG9yKSAlPiUgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKG4pKSAlPiUgc2VsZWN0KG1lYW4pICU+JSBhcy5udW1lcmljKClgIGl0ZW1zIGVhY2g7IHNlZSBUYWJsZSA0LjMuCgojIyMjIFZpc3VhbGl6YXRpb24KCiMjIyMjIFVzaW5nIGFkdWx0cycgc2NhbGVzCgpYWAoKYGBge3J9CnBsb3RzX2QzXzc5X3Njb3JlZF9hZCA8LSByZWx2aXpfZnVuKGQzXzc5X3Njb3JlZF9hZCwgY29sb3JzID0gY29sb3JzMDkpCmBgYAoKYGBge3J9CmZpZ19kM183OV9zY29yZWRfYWRfcGxvdHMgPC0gcGxvdF9ncmlkKHBsb3RzX2QzXzc5X3Njb3JlZF9hZFtbMV1dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdHNfZDNfNzlfc2NvcmVkX2FkW1syXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90c19kM183OV9zY29yZWRfYWRbWzNdXSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkIxIiwgIkIyIiwgIkIzIiksIG5jb2wgPSAzKQoKZmlnX2QzXzc5X3Njb3JlZF9hZF9sZWcgPC0gZ2V0X2xlZ2VuZCgKICBwbG90c19kM183OV9zY29yZWRfYWRbWzFdXSArCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikgKwogICAgc2NhbGVfZmlsbF9tYW51YWwoIlRhcmdldCBjaGFyYWN0ZXIiLCAKICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGNvbG9yczA5LAogICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQodGl0bGUucG9zaXRpb24gPSAibGVmdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDkpKSArCiAgICBzY2FsZV9jb2xvcl9tYW51YWwoIlRhcmdldCBjaGFyYWN0ZXIiLAogICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGNvbG9yczA5LAogICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKHRpdGxlLnBvc2l0aW9uID0gImxlZnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9ICJob3Jpem9udGFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gOSkpKQoKZmlnX2QzXzc5X3Njb3JlZF9hZF9wbG90c19sZWcgPC0gcGxvdF9ncmlkKAogIGZpZ19kM183OV9zY29yZWRfYWRfcGxvdHMsIGZpZ19kM183OV9zY29yZWRfYWRfbGVnLAogIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMSwgMC4wNSkpCgpmaWdfZDNfNzlfc2NvcmVkX2FkX3RpdGxlIDwtIGdnZHJhdygpICsgCiAgZHJhd19sYWJlbCgiU3R1ZHkgMzogQ2hpbGRyZW4sIDctOXkgKHNjb3JlZCB1c2luZyBhZHVsdHMnIHNjYWxlcykiLCBzaXplID0gMTYsIGZvbnRmYWNlID0gJ2JvbGQnLCB4ID0gMCwgaGp1c3QgPSAwKQoKZmlnX2QzXzc5X3Njb3JlZF9hZF9wbG90c19sZWdfdGl0bGUgPC0gcGxvdF9ncmlkKAogIGZpZ19kM183OV9zY29yZWRfYWRfdGl0bGUsIGZpZ19kM183OV9zY29yZWRfYWRfcGxvdHNfbGVnLAogIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMC4xMiwgMSkpCmBgYAoKIyMjIyMgVXNpbmcgY2hpbGRyZW4ncyBvd24gc2NhbGVzCgpYWAoKYGBge3J9CnBsb3RzX2QzXzc5X3Njb3JlZF83OSA8LSByZWx2aXpfZnVuKGQzXzc5X3Njb3JlZF83OSwgY29sb3JzID0gY29sb3JzMDkpCmBgYAoKYGBge3J9CmZpZ19kM183OV9zY29yZWRfNzlfcGxvdHMgPC0gcGxvdF9ncmlkKHBsb3RzX2QzXzc5X3Njb3JlZF83OVtbMV1dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdHNfZDNfNzlfc2NvcmVkXzc5W1syXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90c19kM183OV9zY29yZWRfNzlbWzNdXSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkExIiwgIkEyIiwgIkEzIiksIG5jb2wgPSAzKQoKZmlnX2QzXzc5X3Njb3JlZF83OV9sZWcgPC0gZ2V0X2xlZ2VuZCgKICBwbG90c19kM183OV9zY29yZWRfNzlbWzFdXSArCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikgKwogICAgc2NhbGVfZmlsbF9tYW51YWwoIlRhcmdldCBjaGFyYWN0ZXIiLCB2YWx1ZXMgPSBjb2xvcnMwOSwKICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKHRpdGxlLnBvc2l0aW9uID0gImxlZnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gImhvcml6b250YWwiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSA5KSkgKwogICAgc2NhbGVfY29sb3JfbWFudWFsKCJUYXJnZXQgY2hhcmFjdGVyIiwgdmFsdWVzID0gY29sb3JzMDksCiAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQodGl0bGUucG9zaXRpb24gPSAibGVmdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gImhvcml6b250YWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSA5KSkpCgpmaWdfZDNfNzlfc2NvcmVkXzc5X3Bsb3RzX2xlZyA8LSBwbG90X2dyaWQoCiAgZmlnX2QzXzc5X3Njb3JlZF83OV9wbG90cywgZmlnX2QzXzc5X3Njb3JlZF83OV9sZWcsCiAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygxLCAwLjA1KSkKCmZpZ19kM183OV9zY29yZWRfNzlfdGl0bGUgPC0gZ2dkcmF3KCkgKyAKICBkcmF3X2xhYmVsKCJTdHVkeSAzOiBDaGlsZHJlbiwgNy05eSAoc2NvcmVkIHVzaW5nIHRoZWlyIG93biBzY2FsZXMpIiwgc2l6ZSA9IDE2LCBmb250ZmFjZSA9ICdib2xkJywgeCA9IDAsIGhqdXN0ID0gMCkKCmZpZ19kM183OV9zY29yZWRfNzlfcGxvdHNfbGVnX3RpdGxlIDwtIHBsb3RfZ3JpZCgKICBmaWdfZDNfNzlfc2NvcmVkXzc5X3RpdGxlLCBmaWdfZDNfNzlfc2NvcmVkXzc5X3Bsb3RzX2xlZywKICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDAuMTIsIDEpKQpgYGAKCiMjIyMgQW5hbHlzaXMgb2YgYXN5bW1ldHJpZXMKCmBgYHtyfQpkM183OV9zY29yZWRfYWRfZGlmZiA8LSBkaWZmX2Z1bihkM183OV9zY29yZWRfYWQpCmQzXzc5X3Njb3JlZF83OV9kaWZmIDwtIGRpZmZfZnVuKGQzXzc5X3Njb3JlZF83OSkKc2F2ZVJEUyhkM183OV9zY29yZWRfYWRfZGlmZiwgIi4vZGlmZnNjb3JlX2RhdGEvZDNfNzlfc2NvcmVkX2FkX2RpZmYiKQpzYXZlUkRTKGQzXzc5X3Njb3JlZF83OV9kaWZmLCAiLi9kaWZmc2NvcmVfZGF0YS9kM183OV9zY29yZWRfNzlfZGlmZiIpCmBgYAoKIyMjIyMgVXNpbmcgYWR1bHRzJyBzY2FsZXMKClhYCgpgYGB7cn0KcGxvdF9kM183OV9zY29yZWRfYWRfZGlmZiA8LSBkaWZmcGxvdF9mdW4oZDNfNzlfc2NvcmVkX2FkX2RpZmYsIGNvbG9yczA5KQpgYGAKCmBgYHtyfQojIHJfZDNfNzlfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCA8LSBicm0oCiMgICBkaWZmIH4gMSArICgxIHwgY2hhcmFjdGVyKSwKIyAgIGRhdGEgPSBkM183OV9zY29yZWRfYWRfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFkgLSBIRUFSVCIpLAojICAgY29udHJhc3RzID0gbGlzdChjaGFyYWN0ZXIgPSBjb250cmFzdHNfc3VtX2R2MDkpLAojICAgY29yZXMgPSA0LCBjb250cm9sID0gbGlzdChhZGFwdF9kZWx0YSA9IDAuOTk5KSkKCiMgcl9kM183OV9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUIDwtIGxtZXIoCiMgICBkaWZmIH4gMSArICgxIHwgY2hhcmFjdGVyKSwKIyAgIGRhdGEgPSBkM183OV9zY29yZWRfYWRfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFkgLSBIRUFSVCIpLAojICAgY29udHJhc3RzID0gbGlzdChjaGFyYWN0ZXIgPSBjb250cmFzdHNfc3VtX2R2MDkpKQoKcl9kM183OV9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUIDwtIGxtKAogIGRpZmYgfiAxICsgY2hhcmFjdGVyLAogIGRhdGEgPSBkM183OV9zY29yZWRfYWRfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFkgLSBIRUFSVCIpLAogIGNvbnRyYXN0cyA9IGxpc3QoY2hhcmFjdGVyID0gY29udHJhc3RzX3N1bV9kdjA5KSkKCiMgcl9kM183OV9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUIDwtIGxtKAojICAgZGlmZiB+IDEsCiMgICBkYXRhID0gZDNfNzlfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gSEVBUlQiKSkKCnN1bW1hcnkocl9kM183OV9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUKQpgYGAKCmBgYHtyfQojIHJfZDNfNzlfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIDwtIGJybSgKIyAgIGRpZmYgfiAxICsgKDEgfCBjaGFyYWN0ZXIpLAojICAgZGF0YSA9IGQzXzc5X3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIE1JTkQiKSwKIyAgIGNvbnRyYXN0cyA9IGxpc3QoY2hhcmFjdGVyID0gY29udHJhc3RzX3N1bV9kdjA5KSwKIyAgIGNvcmVzID0gNCwgY29udHJvbCA9IGxpc3QoYWRhcHRfZGVsdGEgPSAwLjk5OSkpCgojIHJfZDNfNzlfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIDwtIGxtZXIoCiMgICBkaWZmIH4gMSArICgxIHwgY2hhcmFjdGVyKSwKIyAgIGRhdGEgPSBkM183OV9zY29yZWRfYWRfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFkgLSBNSU5EIiksCiMgICBjb250cmFzdHMgPSBsaXN0KGNoYXJhY3RlciA9IGNvbnRyYXN0c19zdW1fZHYwOSkpCgpyX2QzXzc5X3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCA8LSBsbSgKICBkaWZmIH4gMSArIGNoYXJhY3RlciwKICBkYXRhID0gZDNfNzlfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gTUlORCIpLAogIGNvbnRyYXN0cyA9IGxpc3QoY2hhcmFjdGVyID0gY29udHJhc3RzX3N1bV9kdjA5KSkKCiMgcl9kM183OV9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQgPC0gbG0oCiMgICBkaWZmIH4gMSwKIyAgIGRhdGEgPSBkM183OV9zY29yZWRfYWRfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFkgLSBNSU5EIikpCgpzdW1tYXJ5KHJfZDNfNzlfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EKQpgYGAKCmBgYHtyfQojIHJfZDNfNzlfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCA8LSBicm0oCiMgICBkaWZmIH4gMSArICgxIHwgY2hhcmFjdGVyKSwKIyAgIGRhdGEgPSBkM183OV9zY29yZWRfYWRfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkhFQVJUIC0gTUlORCIpLAojICAgY29udHJhc3RzID0gbGlzdChjaGFyYWN0ZXIgPSBjb250cmFzdHNfc3VtX2R2MDkpLAojICAgY29yZXMgPSA0LCBjb250cm9sID0gbGlzdChhZGFwdF9kZWx0YSA9IDAuOTk5KSkKCiMgcl9kM183OV9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EIDwtIGxtZXIoCiMgICBkaWZmIH4gMSArICgxIHwgY2hhcmFjdGVyKSwKIyAgIGRhdGEgPSBkM183OV9zY29yZWRfYWRfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkhFQVJUIC0gTUlORCIpLAojICAgY29udHJhc3RzID0gbGlzdChjaGFyYWN0ZXIgPSBjb250cmFzdHNfc3VtX2R2MDkpKQoKcl9kM183OV9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EIDwtIGxtKAogIGRpZmYgfiAxICsgY2hhcmFjdGVyLAogIGRhdGEgPSBkM183OV9zY29yZWRfYWRfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkhFQVJUIC0gTUlORCIpLAogIGNvbnRyYXN0cyA9IGxpc3QoY2hhcmFjdGVyID0gY29udHJhc3RzX3N1bV9kdjA5KSkKCiMgcl9kM183OV9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EIDwtIGxtKAojICAgZGlmZiB+IDEsCiMgICBkYXRhID0gZDNfNzlfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJIRUFSVCAtIE1JTkQiKSkKCnN1bW1hcnkocl9kM183OV9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EKQpgYGAKCiMjIyMjIFVzaW5nIGNoaWxkcmVuJ3Mgb3duIHNjYWxlcwoKWFgKCmBgYHtyfQpwbG90X2QzXzc5X3Njb3JlZF83OV9kaWZmIDwtIGRpZmZwbG90X2Z1bihkM183OV9zY29yZWRfNzlfZGlmZiwgY29sb3JzMDkpCmBgYAoKYGBge3J9CiMgcl9kM183OV9zY29yZWRfNzlfZGlmZl9CT0RZX0hFQVJUIDwtIGJybSgKIyAgIGRpZmYgfiAxICsgKDEgfCBjaGFyYWN0ZXIpLAojICAgZGF0YSA9IGQzXzc5X3Njb3JlZF83OV9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIEhFQVJUIiksCiMgICBjb250cmFzdHMgPSBsaXN0KGNoYXJhY3RlciA9IGNvbnRyYXN0c19zdW1fZHYwOSksCiMgICBjb3JlcyA9IDQsIGNvbnRyb2wgPSBsaXN0KGFkYXB0X2RlbHRhID0gMC45OTkpKQoKIyByX2QzXzc5X3Njb3JlZF83OV9kaWZmX0JPRFlfSEVBUlQgPC0gbG1lcigKIyAgIGRpZmYgfiAxICsgKDEgfCBjaGFyYWN0ZXIpLAojICAgZGF0YSA9IGQzXzc5X3Njb3JlZF83OV9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIEhFQVJUIiksCiMgICBjb250cmFzdHMgPSBsaXN0KGNoYXJhY3RlciA9IGNvbnRyYXN0c19zdW1fZHYwOSkpCgpyX2QzXzc5X3Njb3JlZF83OV9kaWZmX0JPRFlfSEVBUlQgPC0gbG0oCiAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIsCiAgZGF0YSA9IGQzXzc5X3Njb3JlZF83OV9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIEhFQVJUIiksCiAgY29udHJhc3RzID0gbGlzdChjaGFyYWN0ZXIgPSBjb250cmFzdHNfc3VtX2R2MDkpKQoKIyByX2QzXzc5X3Njb3JlZF83OV9kaWZmX0JPRFlfSEVBUlQgPC0gbG0oCiMgICBkaWZmIH4gMSwKIyAgIGRhdGEgPSBkM183OV9zY29yZWRfNzlfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFkgLSBIRUFSVCIpKQoKc3VtbWFyeShyX2QzXzc5X3Njb3JlZF83OV9kaWZmX0JPRFlfSEVBUlQpCmBgYAoKYGBge3J9CiMgcl9kM183OV9zY29yZWRfNzlfZGlmZl9CT0RZX01JTkQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyAoMSB8IGNoYXJhY3RlciksCiMgICBkYXRhID0gZDNfNzlfc2NvcmVkXzc5X2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gTUlORCIpLAojICAgY29udHJhc3RzID0gbGlzdChjaGFyYWN0ZXIgPSBjb250cmFzdHNfc3VtX2R2MDkpLAojICAgY29yZXMgPSA0LCBjb250cm9sID0gbGlzdChhZGFwdF9kZWx0YSA9IDAuOTk5KSkKCiMgcl9kM183OV9zY29yZWRfNzlfZGlmZl9CT0RZX01JTkQgPC0gbG1lcigKIyAgIGRpZmYgfiAxICsgKDEgfCBjaGFyYWN0ZXIpLAojICAgZGF0YSA9IGQzXzc5X3Njb3JlZF83OV9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIE1JTkQiKSwKIyAgIGNvbnRyYXN0cyA9IGxpc3QoY2hhcmFjdGVyID0gY29udHJhc3RzX3N1bV9kdjA5KSkKCnJfZDNfNzlfc2NvcmVkXzc5X2RpZmZfQk9EWV9NSU5EIDwtIGxtKAogIGRpZmYgfiAxICsgY2hhcmFjdGVyLAogIGRhdGEgPSBkM183OV9zY29yZWRfNzlfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFkgLSBNSU5EIiksCiAgY29udHJhc3RzID0gbGlzdChjaGFyYWN0ZXIgPSBjb250cmFzdHNfc3VtX2R2MDkpKQoKIyByX2QzXzc5X3Njb3JlZF83OV9kaWZmX0JPRFlfTUlORCA8LSBsbSgKIyAgIGRpZmYgfiAxLAojICAgZGF0YSA9IGQzXzc5X3Njb3JlZF83OV9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIE1JTkQiKSkKCnN1bW1hcnkocl9kM183OV9zY29yZWRfNzlfZGlmZl9CT0RZX01JTkQpCmBgYAoKYGBge3J9CiMgcl9kM183OV9zY29yZWRfNzlfZGlmZl9IRUFSVF9NSU5EIDwtIGJybSgKIyAgIGRpZmYgfiAxICsgKDEgfCBjaGFyYWN0ZXIpLAojICAgZGF0YSA9IGQzXzc5X3Njb3JlZF83OV9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiSEVBUlQgLSBNSU5EIiksCiMgICBjb250cmFzdHMgPSBsaXN0KGNoYXJhY3RlciA9IGNvbnRyYXN0c19zdW1fZHYwOSksCiMgICBjb3JlcyA9IDQsIGNvbnRyb2wgPSBsaXN0KGFkYXB0X2RlbHRhID0gMC45OTkpKQoKIyByX2QzXzc5X3Njb3JlZF83OV9kaWZmX0hFQVJUX01JTkQgPC0gbG1lcigKIyAgIGRpZmYgfiAxICsgKDEgfCBjaGFyYWN0ZXIpLAojICAgZGF0YSA9IGQzXzc5X3Njb3JlZF83OV9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiSEVBUlQgLSBNSU5EIiksCiMgICBjb250cmFzdHMgPSBsaXN0KGNoYXJhY3RlciA9IGNvbnRyYXN0c19zdW1fZHYwOSkpCgpyX2QzXzc5X3Njb3JlZF83OV9kaWZmX0hFQVJUX01JTkQgPC0gbG0oCiAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIsCiAgZGF0YSA9IGQzXzc5X3Njb3JlZF83OV9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiSEVBUlQgLSBNSU5EIiksCiAgY29udHJhc3RzID0gbGlzdChjaGFyYWN0ZXIgPSBjb250cmFzdHNfc3VtX2R2MDkpKQoKIyByX2QzXzc5X3Njb3JlZF83OV9kaWZmX0hFQVJUX01JTkQgPC0gbG0oCiMgICBkaWZmIH4gMSwKIyAgIGRhdGEgPSBkM183OV9zY29yZWRfNzlfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkhFQVJUIC0gTUlORCIpKQoKc3VtbWFyeShyX2QzXzc5X3Njb3JlZF83OV9kaWZmX0hFQVJUX01JTkQpCmBgYAoKIyMjIENoaWxkcmVuICg0LTZ5KQoKIyMjIyBTY2FsZSBjb25zdHJ1Y3Rpb24KCmBgYHtyfQpzY2FsZXNfZWZhX3dkbV9kM180NiA8LSBzY2FsZV9mdW4oZWZhX3dkbV9kM180NiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yX25hbWVzID0gZmFjdG9yX25hbWVzX2VmYV93ZG1fZDNfNDYpCnNjYWxlc19lZmFfcGFyX2QzXzQ2IDwtIHNjYWxlX2Z1bihlZmFfcGFyX2QzXzQ2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yX25hbWVzID0gZmFjdG9yX25hbWVzX2VmYV9wYXJfZDNfNDYpCmQzXzQ2X3Njb3JlZF9hZCA8LSBzY29yZV9mdW4oZDNfNDYsIHNjYWxlc19lZmFfd2RtX2QzX2FkKQpkM180Nl9zY29yZWRfNDZfd2RtIDwtIHNjb3JlX2Z1bihkM180Niwgc2NhbGVzX2VmYV93ZG1fZDNfNDYpCmQzXzQ2X3Njb3JlZF80Nl9wYXIgPC0gc2NvcmVfZnVuKGQzXzQ2LCBzY2FsZXNfZWZhX3Bhcl9kM180NikKCnNhdmVSRFMoc2NhbGVzX2VmYV93ZG1fZDNfNDYsIGZpbGUgPSAiLi9zY2FsZXMvc2NhbGVzX2VmYV93ZG1fZDNfNDYiKQpzYXZlUkRTKGQzXzQ2X3Njb3JlZF9hZCwgZmlsZSA9ICIuL3Njb3JlZF9kYXRhL2QzXzQ2X3Njb3JlZF9hZCIpCnNhdmVSRFMoZDNfNDZfc2NvcmVkXzQ2X3dkbSwgZmlsZSA9ICIuL3Njb3JlZF9kYXRhL2QzXzQ2X3Njb3JlZF80Nl93ZG0iKQpzYXZlUkRTKGQzXzQ2X3Njb3JlZF80Nl9wYXIsIGZpbGUgPSAiLi9zY29yZWRfZGF0YS9kM180Nl9zY29yZWRfNDZfcGFyIikKYGBgCgojIyMjIyBUaHJlZS1mYWN0b3Igc29sdXRpb24KCkZvbGxvd2luZyB0aGUgc3RlcHMgZGVzY3JpYmVkIGluICJHZW5lcmFsIGFuYWx5c2lzIHBsYW4sIiBhYm92ZSwgeWllbGRlZCBgciBmYWN0X25hbWVfZnVuKGZhY3Rvcl9uYW1lc19lZmFfd2RtX2QzXzQ2KWAgc2NhbGVzIG9mIGByIHNjYWxlc19lZmFfd2RtX2QzXzQ2ICU+JSBjb3VudChmYWN0b3IpICU+JSBzdW1tYXJpc2UobWVhbiA9IG1lYW4obikpICU+JSBzZWxlY3QobWVhbikgJT4lIGFzLm51bWVyaWMoKWAgaXRlbXMgZWFjaDsgc2VlIFRhYmxlIDQuMy4KCiMjIyMjIFR3by1mYWN0b3Igc29sdXRpb24KCkZvbGxvd2luZyB0aGUgc3RlcHMgZGVzY3JpYmVkIGluICJHZW5lcmFsIGFuYWx5c2lzIHBsYW4sIiBhYm92ZSwgeWllbGRlZCBgciBmYWN0X25hbWVfZnVuKGZhY3Rvcl9uYW1lc19lZmFfcGFyX2QzXzQ2KWAgc2NhbGVzIG9mIGByIHNjYWxlc19lZmFfcGFyX2QzXzQ2ICU+JSBjb3VudChmYWN0b3IpICU+JSBzdW1tYXJpc2UobWVhbiA9IG1lYW4obikpICU+JSBzZWxlY3QobWVhbikgJT4lIGFzLm51bWVyaWMoKWAgaXRlbXMgZWFjaDsgc2VlIFRhYmxlIDQuMy4KCiMjIyMgVmlzdWFsaXphdGlvbgoKIyMjIyMgVXNpbmcgYWR1bHRzJyBzY2FsZXMKClhYCgpgYGB7cn0KZmlnX2QzXzQ2X3Njb3JlZF9hZF9wbG90cyA8LSBwbG90X2dyaWQocGxvdHNfZDNfNDZfc2NvcmVkX2FkW1sxXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90c19kM180Nl9zY29yZWRfYWRbWzJdXSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RzX2QzXzQ2X3Njb3JlZF9hZFtbM11dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQzEiLCAiQzIiLCAiQzMiKSwgbmNvbCA9IDMpCgpmaWdfZDNfNDZfc2NvcmVkX2FkX2xlZyA8LSBnZXRfbGVnZW5kKAogIHBsb3RzX2QzXzQ2X3Njb3JlZF9hZFtbMV1dICsKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLCBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKSArCiAgICBzY2FsZV9maWxsX21hbnVhbCgiVGFyZ2V0IGNoYXJhY3RlciIsIHZhbHVlcyA9IGNvbG9yczA5LAogICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQodGl0bGUucG9zaXRpb24gPSAibGVmdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDkpKSArCiAgICBzY2FsZV9jb2xvcl9tYW51YWwoIlRhcmdldCBjaGFyYWN0ZXIiLCB2YWx1ZXMgPSBjb2xvcnMwOSwKICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZCh0aXRsZS5wb3NpdGlvbiA9ICJsZWZ0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDkpKSkKCmZpZ19kM180Nl9zY29yZWRfYWRfcGxvdHNfbGVnIDwtIHBsb3RfZ3JpZCgKICBmaWdfZDNfNDZfc2NvcmVkX2FkX3Bsb3RzLCBmaWdfZDNfNDZfc2NvcmVkX2FkX2xlZywKICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDEsIDAuMDUpKQoKZmlnX2QzXzQ2X3Njb3JlZF9hZF90aXRsZSA8LSBnZ2RyYXcoKSArIAogIGRyYXdfbGFiZWwoIlN0dWR5IDM6IENoaWxkcmVuLCA0LTZ5IChzY29yZWQgdXNpbmcgYWR1bHRzJyBzY2FsZXMpIiwgc2l6ZSA9IDE2LCBmb250ZmFjZSA9ICdib2xkJywgeCA9IDAsIGhqdXN0ID0gMCkKCmZpZ19kM180Nl9zY29yZWRfYWRfcGxvdHNfbGVnX3RpdGxlIDwtIHBsb3RfZ3JpZCgKICBmaWdfZDNfNDZfc2NvcmVkX2FkX3RpdGxlLCBmaWdfZDNfNDZfc2NvcmVkX2FkX3Bsb3RzX2xlZywKICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDAuMTIsIDEpKQpgYGAKCiMjIyMjIFVzaW5nIGNoaWxkcmVuJ3Mgb3duIHNjYWxlcyAodGhyZWUtZmFjdG9yIHNvbHV0aW9uKQoKWFgKCmBgYHtyfQpwbG90c19kM180Nl9zY29yZWRfNDZfd2RtIDwtIHJlbHZpel9mdW4oZDNfNDZfc2NvcmVkXzQ2X3dkbSwgY29sb3JzID0gY29sb3JzMDkpCmBgYAoKYGBge3J9CmZpZ19kM180Nl9zY29yZWRfNDZfd2RtX3Bsb3RzIDwtIHBsb3RfZ3JpZChwbG90c19kM180Nl9zY29yZWRfNDZfd2RtW1sxXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RzX2QzXzQ2X3Njb3JlZF80Nl93ZG1bWzJdXSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdHNfZDNfNDZfc2NvcmVkXzQ2X3dkbVtbM11dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJCMSIsICJCMiIsICJCMyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDMpCgpmaWdfZDNfNDZfc2NvcmVkXzQ2X3dkbV9sZWcgPC0gZ2V0X2xlZ2VuZCgKICBwbG90c19kM180Nl9zY29yZWRfNDZfd2RtW1sxXV0gKwogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpICsKICAgIHNjYWxlX2ZpbGxfbWFudWFsKCJUYXJnZXQgY2hhcmFjdGVyIiwgdmFsdWVzID0gY29sb3JzMDksCiAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZCh0aXRsZS5wb3NpdGlvbiA9ICJsZWZ0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9ICJob3Jpem9udGFsIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gOSkpICsKICAgIHNjYWxlX2NvbG9yX21hbnVhbCgiVGFyZ2V0IGNoYXJhY3RlciIsIHZhbHVlcyA9IGNvbG9yczA5LAogICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKHRpdGxlLnBvc2l0aW9uID0gImxlZnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9ICJob3Jpem9udGFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gOSkpKQoKZmlnX2QzXzQ2X3Njb3JlZF80Nl93ZG1fcGxvdHNfbGVnIDwtIHBsb3RfZ3JpZCgKICBmaWdfZDNfNDZfc2NvcmVkXzQ2X3dkbV9wbG90cywgZmlnX2QzXzQ2X3Njb3JlZF80Nl93ZG1fbGVnLAogIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMSwgMC4wNSkpCgpmaWdfZDNfNDZfc2NvcmVkXzQ2X3dkbV90aXRsZSA8LSBnZ2RyYXcoKSArIAogIGRyYXdfbGFiZWwoIlN0dWR5IDM6IENoaWxkcmVuLCA0LTZ5IChzY29yZWQgdXNpbmcgdGhlaXIgb3duIHNjYWxlcywgMy1mYWN0b3Igc29sdXRpb24pIiwgc2l6ZSA9IDE2LCBmb250ZmFjZSA9ICdib2xkJywgeCA9IDAsIGhqdXN0ID0gMCkKCmZpZ19kM180Nl9zY29yZWRfNDZfd2RtX3Bsb3RzX2xlZ190aXRsZSA8LSBwbG90X2dyaWQoCiAgZmlnX2QzXzQ2X3Njb3JlZF80Nl93ZG1fdGl0bGUsIGZpZ19kM180Nl9zY29yZWRfNDZfd2RtX3Bsb3RzX2xlZywKICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDAuMTIsIDEpKQpgYGAKCiMjIyMjIFVzaW5nIGNoaWxkcmVuJ3Mgb3duIHNjYWxlcyAodGhyZWUtZmFjdG9yIHNvbHV0aW9uKQoKWFgKCmBgYHtyfQpwbG90c19kM180Nl9zY29yZWRfNDZfcGFyIDwtIHJlbHZpel9mdW4oZDNfNDZfc2NvcmVkXzQ2X3BhciwgY29sb3JzID0gY29sb3JzMDkpCmBgYAoKYGBge3J9CmZpZ19kM180Nl9zY29yZWRfNDZfcGFyX3Bsb3RzIDwtIHBsb3RfZ3JpZChwbG90c19kM180Nl9zY29yZWRfNDZfcGFyW1sxXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkMxIiksIG5jb2wgPSAzKQoKZmlnX2QzXzQ2X3Njb3JlZF80Nl9wYXJfbGVnIDwtIGdldF9sZWdlbmQoCiAgcGxvdHNfZDNfNDZfc2NvcmVkXzQ2X3BhcltbMV1dICsKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLCBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKSArCiAgICBzY2FsZV9maWxsX21hbnVhbCgiVGFyZ2V0IGNoYXJhY3RlciIsIHZhbHVlcyA9IGNvbG9yczA5LAogICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQodGl0bGUucG9zaXRpb24gPSAibGVmdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDkpKSArCiAgICBzY2FsZV9jb2xvcl9tYW51YWwoIlRhcmdldCBjaGFyYWN0ZXIiLCB2YWx1ZXMgPSBjb2xvcnMwOSwKICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZCh0aXRsZS5wb3NpdGlvbiA9ICJsZWZ0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDkpKSkKCmZpZ19kM180Nl9zY29yZWRfNDZfcGFyX3Bsb3RzX2xlZyA8LSBwbG90X2dyaWQoCiAgZmlnX2QzXzQ2X3Njb3JlZF80Nl9wYXJfcGxvdHMsIGZpZ19kM180Nl9zY29yZWRfNDZfcGFyX2xlZywKICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDEsIDAuMDUpKQoKZmlnX2QzXzQ2X3Njb3JlZF80Nl9wYXJfdGl0bGUgPC0gZ2dkcmF3KCkgKyAKICBkcmF3X2xhYmVsKCJTdHVkeSAzOiBDaGlsZHJlbiwgNC02eSAoc2NvcmVkIHVzaW5nIHRoZWlyIG93biBzY2FsZXMsIDItZmFjdG9yIHNvbHV0aW9uKSIsIHNpemUgPSAxNiwgZm9udGZhY2UgPSAnYm9sZCcsIHggPSAwLCBoanVzdCA9IDApCgpmaWdfZDNfNDZfc2NvcmVkXzQ2X3Bhcl9wbG90c19sZWdfdGl0bGUgPC0gcGxvdF9ncmlkKAogIGZpZ19kM180Nl9zY29yZWRfNDZfcGFyX3RpdGxlLCBmaWdfZDNfNDZfc2NvcmVkXzQ2X3Bhcl9wbG90c19sZWcsCiAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygwLjEyLCAxKSkKYGBgCgojIyMjIEFuYWx5c2lzIG9mIGFzeW1tZXRyaWVzCgpgYGB7cn0KZDNfNDZfc2NvcmVkX2FkX2RpZmYgPC0gZGlmZl9mdW4oZDNfNDZfc2NvcmVkX2FkKQpkM180Nl9zY29yZWRfNDZfd2RtX2RpZmYgPC0gZGlmZl9mdW4oZDNfNDZfc2NvcmVkXzQ2X3dkbSkKZDNfNDZfc2NvcmVkXzQ2X3Bhcl9kaWZmIDwtIGRpZmZfZnVuKGQzXzQ2X3Njb3JlZF80Nl9wYXIpCnNhdmVSRFMoZDNfNDZfc2NvcmVkX2FkX2RpZmYsICIuL2RpZmZzY29yZV9kYXRhL2QzXzQ2X3Njb3JlZF9hZF9kaWZmIikKc2F2ZVJEUyhkM180Nl9zY29yZWRfNDZfd2RtX2RpZmYsICIuL2RpZmZzY29yZV9kYXRhL2QzXzQ2X3Njb3JlZF80Nl93ZG1fZGlmZiIpCnNhdmVSRFMoZDNfNDZfc2NvcmVkXzQ2X3Bhcl9kaWZmLCAiLi9kaWZmc2NvcmVfZGF0YS9kM180Nl9zY29yZWRfNDZfcGFyX2RpZmYiKQpgYGAKCiMjIyMjIFVzaW5nIGFkdWx0cycgc2NhbGVzCgpYWAoKYGBge3J9CnBsb3RfZDNfNDZfc2NvcmVkX2FkX2RpZmYgPC0gZGlmZnBsb3RfZnVuKGQzXzQ2X3Njb3JlZF9hZF9kaWZmLCBjb2xvcnMwOSkKYGBgCgpgYGB7cn0KIyByX2QzXzQ2X3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyAoMSB8IGNoYXJhY3RlciksCiMgICBkYXRhID0gZDNfNDZfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gSEVBUlQiKSwKIyAgIGNvbnRyYXN0cyA9IGxpc3QoY2hhcmFjdGVyID0gY29udHJhc3RzX3N1bV9kdjA5KSwKIyAgIGNvcmVzID0gNCwgY29udHJvbCA9IGxpc3QoYWRhcHRfZGVsdGEgPSAwLjk5OSkpCgojIHJfZDNfNDZfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCA8LSBsbWVyKAojICAgZGlmZiB+IDEgKyAoMSB8IGNoYXJhY3RlciksCiMgICBkYXRhID0gZDNfNDZfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gSEVBUlQiKSwKIyAgIGNvbnRyYXN0cyA9IGxpc3QoY2hhcmFjdGVyID0gY29udHJhc3RzX3N1bV9kdjA5KSkKCnJfZDNfNDZfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCA8LSBsbSgKICBkaWZmIH4gMSArIGNoYXJhY3RlciwKICBkYXRhID0gZDNfNDZfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gSEVBUlQiKSwKICBjb250cmFzdHMgPSBsaXN0KGNoYXJhY3RlciA9IGNvbnRyYXN0c19zdW1fZHYwOSkpCgojIHJfZDNfNDZfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCA8LSBsbSgKIyAgIGRpZmYgfiAxLAojICAgZGF0YSA9IGQzXzQ2X3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIEhFQVJUIikpCgpzdW1tYXJ5KHJfZDNfNDZfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCkKYGBgCgpgYGB7cn0KIyByX2QzXzQ2X3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCA8LSBicm0oCiMgICBkaWZmIH4gMSArICgxIHwgY2hhcmFjdGVyKSwKIyAgIGRhdGEgPSBkM180Nl9zY29yZWRfYWRfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFkgLSBNSU5EIiksCiMgICBjb250cmFzdHMgPSBsaXN0KGNoYXJhY3RlciA9IGNvbnRyYXN0c19zdW1fZHYwOSksCiMgICBjb3JlcyA9IDQsIGNvbnRyb2wgPSBsaXN0KGFkYXB0X2RlbHRhID0gMC45OTkpKQoKIyByX2QzXzQ2X3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCA8LSBsbWVyKAojICAgZGlmZiB+IDEgKyAoMSB8IGNoYXJhY3RlciksCiMgICBkYXRhID0gZDNfNDZfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gTUlORCIpLAojICAgY29udHJhc3RzID0gbGlzdChjaGFyYWN0ZXIgPSBjb250cmFzdHNfc3VtX2R2MDkpKQoKcl9kM180Nl9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQgPC0gbG0oCiAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIsCiAgZGF0YSA9IGQzXzQ2X3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIE1JTkQiKSwKICBjb250cmFzdHMgPSBsaXN0KGNoYXJhY3RlciA9IGNvbnRyYXN0c19zdW1fZHYwOSkpCgojIHJfZDNfNDZfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIDwtIGxtKAojICAgZGlmZiB+IDEsCiMgICBkYXRhID0gZDNfNDZfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gTUlORCIpKQoKc3VtbWFyeShyX2QzXzQ2X3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCkKYGBgCgpgYGB7cn0KIyByX2QzXzQ2X3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyAoMSB8IGNoYXJhY3RlciksCiMgICBkYXRhID0gZDNfNDZfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJIRUFSVCAtIE1JTkQiKSwKIyAgIGNvbnRyYXN0cyA9IGxpc3QoY2hhcmFjdGVyID0gY29udHJhc3RzX3N1bV9kdjA5KSwKIyAgIGNvcmVzID0gNCwgY29udHJvbCA9IGxpc3QoYWRhcHRfZGVsdGEgPSAwLjk5OSkpCgojIHJfZDNfNDZfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCA8LSBsbWVyKAojICAgZGlmZiB+IDEgKyAoMSB8IGNoYXJhY3RlciksCiMgICBkYXRhID0gZDNfNDZfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJIRUFSVCAtIE1JTkQiKSwKIyAgIGNvbnRyYXN0cyA9IGxpc3QoY2hhcmFjdGVyID0gY29udHJhc3RzX3N1bV9kdjA5KSkKCnJfZDNfNDZfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCA8LSBsbSgKICBkaWZmIH4gMSArIGNoYXJhY3RlciwKICBkYXRhID0gZDNfNDZfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJIRUFSVCAtIE1JTkQiKSwKICBjb250cmFzdHMgPSBsaXN0KGNoYXJhY3RlciA9IGNvbnRyYXN0c19zdW1fZHYwOSkpCgojIHJfZDNfNDZfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCA8LSBsbSgKIyAgIGRpZmYgfiAxLAojICAgZGF0YSA9IGQzXzQ2X3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiSEVBUlQgLSBNSU5EIikpCgpzdW1tYXJ5KHJfZDNfNDZfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCkKYGBgCgojIyMjIyMgRGV2ZWxvcG1lbnRhbCBjb21wYXJpc29uCgpgYGB7cn0KIyByX2QzX2FkNzk0Nl9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUIDwtIGJybSgKIyAgIGRpZmYgfiAxICsgYWdlX2dyb3VwICsgKDEgfCBjaGFyYWN0ZXIpLAojICAgZGF0YSA9IGQzX2FkX3Njb3JlZF9hZF9kaWZmICU+JQojICAgICBmdWxsX2pvaW4oZDNfNzlfc2NvcmVkX2FkX2RpZmYpICU+JQojICAgICBmdWxsX2pvaW4oZDNfNDZfc2NvcmVkX2FkX2RpZmYpICU+JQojICAgICBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIEhFQVJUIiksCiMgICBjb250cmFzdHMgPSBsaXN0KGNoYXJhY3RlciA9IGNvbnRyYXN0c19zdW1fZHYwOSwKIyAgICAgICAgICAgICAgICAgICAgYWdlX2dyb3VwID0gY29udHJhc3RzX2R1bTNfYWdlZ3ApLAojICAgY29yZXMgPSA0LCBjb250cm9sID0gbGlzdChhZGFwdF9kZWx0YSA9IDAuOTk5KSkKCiMgcl9kM19hZDc5NDZfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCA8LSBsbWVyKAojICAgZGlmZiB+IDEgKyBhZ2VfZ3JvdXAgKyAoMSB8IGNoYXJhY3RlciksCiMgICBkYXRhID0gZDNfYWRfc2NvcmVkX2FkX2RpZmYgJT4lCiMgICAgIGZ1bGxfam9pbihkM183OV9zY29yZWRfYWRfZGlmZikgJT4lCiMgICAgIGZ1bGxfam9pbihkM180Nl9zY29yZWRfYWRfZGlmZikgJT4lCiMgICAgIGZpbHRlcihwYWlyID09ICJCT0RZIC0gSEVBUlQiKSwKIyAgIGNvbnRyYXN0cyA9IGxpc3QoY2hhcmFjdGVyID0gY29udHJhc3RzX3N1bV9kdjA5LAojICAgICAgICAgICAgICAgICAgICBhZ2VfZ3JvdXAgPSBjb250cmFzdHNfZHVtM19hZ2VncCkpCgpyX2QzX2FkNzk0Nl9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUIDwtIGxtKAogIGRpZmYgfiAxICsgY2hhcmFjdGVyICogYWdlX2dyb3VwLAogIGRhdGEgPSBkM19hZF9zY29yZWRfYWRfZGlmZiAlPiUgCiAgICBmdWxsX2pvaW4oZDNfNzlfc2NvcmVkX2FkX2RpZmYpICU+JQogICAgZnVsbF9qb2luKGQzXzQ2X3Njb3JlZF9hZF9kaWZmKSAlPiUKICAgIGZpbHRlcihwYWlyID09ICJCT0RZIC0gSEVBUlQiKSwKICBjb250cmFzdHMgPSBsaXN0KGNoYXJhY3RlciA9IGNvbnRyYXN0c19zdW1fZHYwOSwKICAgICAgICAgICAgICAgICAgIGFnZV9ncm91cCA9IGNvbnRyYXN0c19kdW0zX2FnZWdwKSkKCiMgcl9kM19hZDc5NDZfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCA8LSBsbSgKIyAgIGRpZmYgfiAxICsgYWdlX2dyb3VwLAojICAgZGF0YSA9IGQzX2FkX3Njb3JlZF9hZF9kaWZmICU+JQojICAgICBmdWxsX2pvaW4oZDNfNzlfc2NvcmVkX2FkX2RpZmYpICU+JQojICAgICBmdWxsX2pvaW4oZDNfNDZfc2NvcmVkX2FkX2RpZmYpICU+JQojICAgICBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIEhFQVJUIiksCiMgICBjb250cmFzdHMgPSBsaXN0KGFnZV9ncm91cCA9IGNvbnRyYXN0c19kdW0zX2FnZWdwKSkKCnN1bW1hcnkocl9kM19hZDc5NDZfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCkKYGBgCgpgYGB7cn0KIyByX2QzX2FkNzk0Nl9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyBhZ2VfZ3JvdXAgKyAoMSB8IGNoYXJhY3RlciksCiMgICBkYXRhID0gZDNfYWRfc2NvcmVkX2FkX2RpZmYgJT4lCiMgICAgIGZ1bGxfam9pbihkM183OV9zY29yZWRfYWRfZGlmZikgJT4lCiMgICAgIGZ1bGxfam9pbihkM180Nl9zY29yZWRfYWRfZGlmZikgJT4lCiMgICAgIGZpbHRlcihwYWlyID09ICJCT0RZIC0gTUlORCIpLAojICAgY29udHJhc3RzID0gbGlzdChjaGFyYWN0ZXIgPSBjb250cmFzdHNfc3VtX2R2MDksCiMgICAgICAgICAgICAgICAgICAgIGFnZV9ncm91cCA9IGNvbnRyYXN0c19kdW0zX2FnZWdwKSwKIyAgIGNvcmVzID0gNCwgY29udHJvbCA9IGxpc3QoYWRhcHRfZGVsdGEgPSAwLjk5OSkpCgojIHJfZDNfYWQ3OTQ2X3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCA8LSBsbWVyKAojICAgZGlmZiB+IDEgKyBhZ2VfZ3JvdXAgKyAoMSB8IGNoYXJhY3RlciksCiMgICBkYXRhID0gZDNfYWRfc2NvcmVkX2FkX2RpZmYgJT4lCiMgICAgIGZ1bGxfam9pbihkM183OV9zY29yZWRfYWRfZGlmZikgJT4lCiMgICAgIGZ1bGxfam9pbihkM180Nl9zY29yZWRfYWRfZGlmZikgJT4lCiMgICAgIGZpbHRlcihwYWlyID09ICJCT0RZIC0gTUlORCIpLAojICAgY29udHJhc3RzID0gbGlzdChjaGFyYWN0ZXIgPSBjb250cmFzdHNfc3VtX2R2MDksCiMgICAgICAgICAgICAgICAgICAgIGFnZV9ncm91cCA9IGNvbnRyYXN0c19kdW0zX2FnZWdwKSkKCnJfZDNfYWQ3OTQ2X3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCA8LSBsbSgKICBkaWZmIH4gMSArIGNoYXJhY3RlciAqIGFnZV9ncm91cCwKICBkYXRhID0gZDNfYWRfc2NvcmVkX2FkX2RpZmYgJT4lIAogICAgZnVsbF9qb2luKGQzXzc5X3Njb3JlZF9hZF9kaWZmKSAlPiUKICAgIGZ1bGxfam9pbihkM180Nl9zY29yZWRfYWRfZGlmZikgJT4lCiAgICBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIE1JTkQiKSwKICBjb250cmFzdHMgPSBsaXN0KGNoYXJhY3RlciA9IGNvbnRyYXN0c19zdW1fZHYwOSwKICAgICAgICAgICAgICAgICAgIGFnZV9ncm91cCA9IGNvbnRyYXN0c19kdW0zX2FnZWdwKSkKCiMgcl9kM19hZDc5NDZfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIDwtIGxtKAojICAgZGlmZiB+IDEgKyBhZ2VfZ3JvdXAsCiMgICBkYXRhID0gZDNfYWRfc2NvcmVkX2FkX2RpZmYgJT4lCiMgICAgIGZ1bGxfam9pbihkM183OV9zY29yZWRfYWRfZGlmZikgJT4lCiMgICAgIGZ1bGxfam9pbihkM180Nl9zY29yZWRfYWRfZGlmZikgJT4lCiMgICAgIGZpbHRlcihwYWlyID09ICJCT0RZIC0gTUlORCIpLAojICAgY29udHJhc3RzID0gbGlzdChhZ2VfZ3JvdXAgPSBjb250cmFzdHNfZHVtM19hZ2VncCkpCgpzdW1tYXJ5KHJfZDNfYWQ3OTQ2X3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCkKYGBgCgpgYGB7cn0KIyByX2QzX2FkNzk0Nl9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EIDwtIGJybSgKIyAgIGRpZmYgfiAxICsgYWdlX2dyb3VwICsgKDEgfCBjaGFyYWN0ZXIpLAojICAgZGF0YSA9IGQzX2FkX3Njb3JlZF9hZF9kaWZmICU+JQojICAgICBmdWxsX2pvaW4oZDNfNzlfc2NvcmVkX2FkX2RpZmYpICU+JQojICAgICBmdWxsX2pvaW4oZDNfNDZfc2NvcmVkX2FkX2RpZmYpICU+JQojICAgICBmaWx0ZXIocGFpciA9PSAiSEVBUlQgLSBNSU5EIiksCiMgICBjb250cmFzdHMgPSBsaXN0KGNoYXJhY3RlciA9IGNvbnRyYXN0c19zdW1fZHYwOSwKIyAgICAgICAgICAgICAgICAgICAgYWdlX2dyb3VwID0gY29udHJhc3RzX2R1bTNfYWdlZ3ApLAojICAgY29yZXMgPSA0LCBjb250cm9sID0gbGlzdChhZGFwdF9kZWx0YSA9IDAuOTk5KSkKCiMgcl9kM19hZDc5NDZfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCA8LSBsbWVyKAojICAgZGlmZiB+IDEgKyBhZ2VfZ3JvdXAgKyAoMSB8IGNoYXJhY3RlciksCiMgICBkYXRhID0gZDNfYWRfc2NvcmVkX2FkX2RpZmYgJT4lCiMgICAgIGZ1bGxfam9pbihkM183OV9zY29yZWRfYWRfZGlmZikgJT4lCiMgICAgIGZ1bGxfam9pbihkM180Nl9zY29yZWRfYWRfZGlmZikgJT4lCiMgICAgIGZpbHRlcihwYWlyID09ICJIRUFSVCAtIE1JTkQiKSwKIyAgIGNvbnRyYXN0cyA9IGxpc3QoY2hhcmFjdGVyID0gY29udHJhc3RzX3N1bV9kdjA5LAojICAgICAgICAgICAgICAgICAgICBhZ2VfZ3JvdXAgPSBjb250cmFzdHNfZHVtM19hZ2VncCkpCgpyX2QzX2FkNzk0Nl9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EIDwtIGxtKAogIGRpZmYgfiAxICsgY2hhcmFjdGVyICogYWdlX2dyb3VwLAogIGRhdGEgPSBkM19hZF9zY29yZWRfYWRfZGlmZiAlPiUgCiAgICBmdWxsX2pvaW4oZDNfNzlfc2NvcmVkX2FkX2RpZmYpICU+JQogICAgZnVsbF9qb2luKGQzXzQ2X3Njb3JlZF9hZF9kaWZmKSAlPiUKICAgIGZpbHRlcihwYWlyID09ICJIRUFSVCAtIE1JTkQiKSwKICBjb250cmFzdHMgPSBsaXN0KGNoYXJhY3RlciA9IGNvbnRyYXN0c19zdW1fZHYwOSwKICAgICAgICAgICAgICAgICAgIGFnZV9ncm91cCA9IGNvbnRyYXN0c19kdW0zX2FnZWdwKSkKCiMgcl9kM19hZDc5NDZfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCA8LSBsbSgKIyAgIGRpZmYgfiAxICsgYWdlX2dyb3VwLAojICAgZGF0YSA9IGQzX2FkX3Njb3JlZF9hZF9kaWZmICU+JQojICAgICBmdWxsX2pvaW4oZDNfNzlfc2NvcmVkX2FkX2RpZmYpICU+JQojICAgICBmdWxsX2pvaW4oZDNfNDZfc2NvcmVkX2FkX2RpZmYpICU+JQojICAgICBmaWx0ZXIocGFpciA9PSAiSEVBUlQgLSBNSU5EIiksCiMgICBjb250cmFzdHMgPSBsaXN0KGFnZV9ncm91cCA9IGNvbnRyYXN0c19kdW0zX2FnZWdwKSkKCnN1bW1hcnkocl9kM19hZDc5NDZfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCkKYGBgCgojIyMjIyBVc2luZyBjaGlsZHJlbidzIG93biBzY2FsZXMgKHRocmVlLWZhY3RvciBzb2x1dGlvbikKClhYCgpgYGB7cn0KcGxvdF9kM180Nl9zY29yZWRfNDZfd2RtX2RpZmYgPC0gZGlmZnBsb3RfZnVuKGQzXzQ2X3Njb3JlZF80Nl93ZG1fZGlmZiwgY29sb3JzMDkpCmBgYAoKYGBge3J9CiMgcl9kM180Nl9zY29yZWRfNDZfd2RtX2RpZmZfQk9EWV9IRUFSVCA8LSBicm0oCiMgICBkaWZmIH4gMSArICgxIHwgY2hhcmFjdGVyKSwKIyAgIGRhdGEgPSBkM180Nl9zY29yZWRfNDZfd2RtX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZKiAtIEhFQVJUKiIpLAojICAgY29udHJhc3RzID0gbGlzdChjaGFyYWN0ZXIgPSBjb250cmFzdHNfc3VtX2R2MDkpLAojICAgY29yZXMgPSA0LCBjb250cm9sID0gbGlzdChhZGFwdF9kZWx0YSA9IDAuOTk5KSkKCiMgcl9kM180Nl9zY29yZWRfNDZfd2RtX2RpZmZfQk9EWV9IRUFSVCA8LSBsbWVyKAojICAgZGlmZiB+IDEgKyAoMSB8IGNoYXJhY3RlciksCiMgICBkYXRhID0gZDNfNDZfc2NvcmVkXzQ2X3dkbV9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSogLSBIRUFSVCoiKSwKIyAgIGNvbnRyYXN0cyA9IGxpc3QoY2hhcmFjdGVyID0gY29udHJhc3RzX3N1bV9kdjA5KSkKCnJfZDNfNDZfc2NvcmVkXzQ2X3dkbV9kaWZmX0JPRFlfSEVBUlQgPC0gbG0oCiAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIsCiAgZGF0YSA9IGQzXzQ2X3Njb3JlZF80Nl93ZG1fZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFkqIC0gSEVBUlQqIiksCiAgY29udHJhc3RzID0gbGlzdChjaGFyYWN0ZXIgPSBjb250cmFzdHNfc3VtX2R2MDkpKQoKIyByX2QzXzQ2X3Njb3JlZF80Nl93ZG1fZGlmZl9CT0RZX0hFQVJUIDwtIGxtKAojICAgZGlmZiB+IDEsCiMgICBkYXRhID0gZDNfNDZfc2NvcmVkXzQ2X3dkbV9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSogLSBIRUFSVCoiKSkKCnN1bW1hcnkocl9kM180Nl9zY29yZWRfNDZfd2RtX2RpZmZfQk9EWV9IRUFSVCkKYGBgCgpgYGB7cn0KIyByX2QzXzQ2X3Njb3JlZF80Nl93ZG1fZGlmZl9CT0RZX01JTkQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyAoMSB8IGNoYXJhY3RlciksCiMgICBkYXRhID0gZDNfNDZfc2NvcmVkXzQ2X3dkbV9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSogLSBNSU5EIiksCiMgICBjb250cmFzdHMgPSBsaXN0KGNoYXJhY3RlciA9IGNvbnRyYXN0c19zdW1fZHYwOSksCiMgICBjb3JlcyA9IDQsIGNvbnRyb2wgPSBsaXN0KGFkYXB0X2RlbHRhID0gMC45OTkpKQoKIyByX2QzXzQ2X3Njb3JlZF80Nl93ZG1fZGlmZl9CT0RZX01JTkQgPC0gbG1lcigKIyAgIGRpZmYgfiAxICsgKDEgfCBjaGFyYWN0ZXIpLAojICAgZGF0YSA9IGQzXzQ2X3Njb3JlZF80Nl93ZG1fZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFkqIC0gTUlORCIpLAojICAgY29udHJhc3RzID0gbGlzdChjaGFyYWN0ZXIgPSBjb250cmFzdHNfc3VtX2R2MDkpKQoKcl9kM180Nl9zY29yZWRfNDZfd2RtX2RpZmZfQk9EWV9NSU5EIDwtIGxtKAogIGRpZmYgfiAxICsgY2hhcmFjdGVyLAogIGRhdGEgPSBkM180Nl9zY29yZWRfNDZfd2RtX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZKiAtIE1JTkQiKSwKICBjb250cmFzdHMgPSBsaXN0KGNoYXJhY3RlciA9IGNvbnRyYXN0c19zdW1fZHYwOSkpCgojIHJfZDNfNDZfc2NvcmVkXzQ2X3dkbV9kaWZmX0JPRFlfTUlORCA8LSBsbSgKIyAgIGRpZmYgfiAxLAojICAgZGF0YSA9IGQzXzQ2X3Njb3JlZF80Nl93ZG1fZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFkqIC0gTUlORCIpKQoKc3VtbWFyeShyX2QzXzQ2X3Njb3JlZF80Nl93ZG1fZGlmZl9CT0RZX01JTkQpCmBgYAoKYGBge3J9CiMgcl9kM180Nl9zY29yZWRfNDZfd2RtX2RpZmZfSEVBUlRfTUlORCA8LSBicm0oCiMgICBkaWZmIH4gMSArICgxIHwgY2hhcmFjdGVyKSwKIyAgIGRhdGEgPSBkM180Nl9zY29yZWRfNDZfd2RtX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJIRUFSVCogLSBNSU5EIiksCiMgICBjb250cmFzdHMgPSBsaXN0KGNoYXJhY3RlciA9IGNvbnRyYXN0c19zdW1fZHYwOSksCiMgICBjb3JlcyA9IDQsIGNvbnRyb2wgPSBsaXN0KGFkYXB0X2RlbHRhID0gMC45OTkpKQoKIyByX2QzXzQ2X3Njb3JlZF80Nl93ZG1fZGlmZl9IRUFSVF9NSU5EIDwtIGxtZXIoCiMgICBkaWZmIH4gMSArICgxIHwgY2hhcmFjdGVyKSwKIyAgIGRhdGEgPSBkM180Nl9zY29yZWRfNDZfd2RtX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJIRUFSVCogLSBNSU5EIiksCiMgICBjb250cmFzdHMgPSBsaXN0KGNoYXJhY3RlciA9IGNvbnRyYXN0c19zdW1fZHYwOSkpCgpyX2QzXzQ2X3Njb3JlZF80Nl93ZG1fZGlmZl9IRUFSVF9NSU5EIDwtIGxtKAogIGRpZmYgfiAxICsgY2hhcmFjdGVyLAogIGRhdGEgPSBkM180Nl9zY29yZWRfNDZfd2RtX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJIRUFSVCogLSBNSU5EIiksCiAgY29udHJhc3RzID0gbGlzdChjaGFyYWN0ZXIgPSBjb250cmFzdHNfc3VtX2R2MDkpKQoKIyByX2QzXzQ2X3Njb3JlZF80Nl93ZG1fZGlmZl9IRUFSVF9NSU5EIDwtIGxtKAojICAgZGlmZiB+IDEsCiMgICBkYXRhID0gZDNfNDZfc2NvcmVkXzQ2X3dkbV9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiSEVBUlQqIC0gTUlORCIpKQoKc3VtbWFyeShyX2QzXzQ2X3Njb3JlZF80Nl93ZG1fZGlmZl9IRUFSVF9NSU5EKQpgYGAKCiMjIyMjIFVzaW5nIGNoaWxkcmVuJ3Mgb3duIHNjYWxlcyAodHdvLWZhY3RvciBzb2x1dGlvbikKClhYCgpgYGB7cn0KcGxvdF9kM180Nl9zY29yZWRfNDZfcGFyX2RpZmYgPC0gZGlmZnBsb3RfZnVuKGQzXzQ2X3Njb3JlZF80Nl9wYXJfZGlmZiwgY29sb3JzMDkpCmBgYAoKYGBge3J9CiMgcl9kM180Nl9zY29yZWRfNDZfcGFyX2RpZmZfQk9EWUhFQVJUX01JTkQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyAoMSB8IGNoYXJhY3RlciksCiMgICBkYXRhID0gZDNfNDZfc2NvcmVkXzQ2X3Bhcl9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWS1IRUFSVCAtIE1JTkQiKSwKIyAgIGNvbnRyYXN0cyA9IGxpc3QoY2hhcmFjdGVyID0gY29udHJhc3RzX3N1bV9kdjA5KSwKIyAgIGNvcmVzID0gNCwgY29udHJvbCA9IGxpc3QoYWRhcHRfZGVsdGEgPSAwLjk5OSkpCgojIHJfZDNfNDZfc2NvcmVkXzQ2X3Bhcl9kaWZmX0JPRFlIRUFSVF9NSU5EIDwtIGxtZXIoCiMgICBkaWZmIH4gMSArICgxIHwgY2hhcmFjdGVyKSwKIyAgIGRhdGEgPSBkM180Nl9zY29yZWRfNDZfcGFyX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZLUhFQVJUIC0gTUlORCIpLAojICAgY29udHJhc3RzID0gbGlzdChjaGFyYWN0ZXIgPSBjb250cmFzdHNfc3VtX2R2MDkpKQoKcl9kM180Nl9zY29yZWRfNDZfcGFyX2RpZmZfQk9EWUhFQVJUX01JTkQgPC0gbG0oCiAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIsCiAgZGF0YSA9IGQzXzQ2X3Njb3JlZF80Nl9wYXJfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFktSEVBUlQgLSBNSU5EIiksCiAgY29udHJhc3RzID0gbGlzdChjaGFyYWN0ZXIgPSBjb250cmFzdHNfc3VtX2R2MDkpKQoKIyByX2QzXzQ2X3Njb3JlZF80Nl9wYXJfZGlmZl9CT0RZSEVBUlRfTUlORCA8LSBsbSgKIyAgIGRpZmYgfiAxLAojICAgZGF0YSA9IGQzXzQ2X3Njb3JlZF80Nl9wYXJfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFktSEVBUlQgLSBNSU5EIikpCgpzdW1tYXJ5KHJfZDNfNDZfc2NvcmVkXzQ2X3Bhcl9kaWZmX0JPRFlIRUFSVF9NSU5EKQpgYGAKCiMjIERpc2N1c3Npb24KClhYCgpgYGB7cn0Kc2NhbGVzX3N0dWR5MyA8LSBiaW5kX3Jvd3Moc2NhbGVzX2VmYV93ZG1fZDNfYWQgJT4lIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShzdHVkeSA9ICJBZHVsdHMiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVzX2VmYV93ZG1fZDNfNzkgJT4lIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShzdHVkeSA9ICJPbGRlciBjaGlsZHJlbiwgNy05eSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZXNfZWZhX3dkbV9kM180NiAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUoc3R1ZHkgPSAiWW91bmdlciBjaGlsZHJlbiwgNC02eSAoMy1mYWN0b3Igc29sdXRpb24pIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlc19lZmFfcGFyX2QzXzQ2ICU+JQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShzdHVkeSA9ICJZb3VuZ2VyIGNoaWxkcmVuLCA0LTZ5ICgyLWZhY3RvciBzb2x1dGlvbikiKSkgJT4lCiAgc2VsZWN0KC1jKGxvYWRpbmcsIG9yZGVyKSkgJT4lCiAgZGlzdGluY3QoKSAlPiUKICBtdXRhdGUoc3R1ZHkgPSBmYWN0b3Ioc3R1ZHksCiAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIkFkdWx0cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9sZGVyIGNoaWxkcmVuLCA3LTl5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWW91bmdlciBjaGlsZHJlbiwgNC02eSAoMy1mYWN0b3Igc29sdXRpb24pIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWW91bmdlciBjaGlsZHJlbiwgNC02eSAoMi1mYWN0b3Igc29sdXRpb24pIikpKSAlPiUKICBzcHJlYWQoc3R1ZHksIGZhY3RvcikgJT4lCiAgbXV0YXRlKHVyX2ZhY3RvciA9IGlmZWxzZSghaXMubmEoYEFkdWx0c2ApLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBBZHVsdHNgLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSghaXMubmEoYE9sZGVyIGNoaWxkcmVuLCA3LTl5YCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBPbGRlciBjaGlsZHJlbiwgNy05eWAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGlzLm5hKGBZb3VuZ2VyIGNoaWxkcmVuLCA0LTZ5ICgzLWZhY3RvciBzb2x1dGlvbilgKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBZb3VuZ2VyIGNoaWxkcmVuLCA0LTZ5ICgzLWZhY3RvciBzb2x1dGlvbilgLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgWW91bmdlciBjaGlsZHJlbiwgNC02eSAoMi1mYWN0b3Igc29sdXRpb24pYCkpKSkgJT4lCiAgbGVmdF9qb2luKHNjYWxlc19lZmFfd2RtX2QzX2FkICU+JSAKICAgICAgICAgICAgICBzZWxlY3QoY2FwYWNpdHksIG9yZGVyKSAlPiUgcmVuYW1lKG9yZGVyX2FkID0gb3JkZXIpKSAlPiUKICBsZWZ0X2pvaW4oc2NhbGVzX2VmYV93ZG1fZDNfNzkgJT4lIAogICAgICAgICAgICAgIHNlbGVjdChjYXBhY2l0eSwgb3JkZXIpICU+JSByZW5hbWUob3JkZXJfNzkgPSBvcmRlcikpICU+JQogIGFycmFuZ2UodXJfZmFjdG9yLCBvcmRlcl9hZCwgb3JkZXJfNzkpICU+JQogIHNlbGVjdCgtYyh1cl9mYWN0b3IsIHN0YXJ0c193aXRoKCJvcmRlciIpKSkKYGBgCgpgYGB7cn0KdGFibGU0LjMgPC0gc2NhbGVzX3N0dWR5MyAlPiUKICBtdXRhdGVfYWxsKGFzLmNoYXJhY3RlcikgJT4lCiAgIyBkZWFsIHdpdGggeW91bmdlciBjaGlsZHJlbiwgMi1mYWN0b3Igc29sdXRpb24KICBtdXRhdGUodGVtcDEgPSBgWW91bmdlciBjaGlsZHJlbiwgNC02eSAoMi1mYWN0b3Igc29sdXRpb24pYCwKICAgICAgICAgdGVtcDIgPSBnc3ViKCJcXCoiLCAiIiwgdGVtcDEpLAogICAgICAgICB0ZW1wMyA9IGNhc2Vfd2hlbigKICAgICAgICAgICB0ZW1wMiA9PSBgQWR1bHRzYCB8IAogICAgICAgICAgICAgdGVtcDIgPT0gYE9sZGVyIGNoaWxkcmVuLCA3LTl5YCB+ICLinJMiLAogICAgICAgICAgIGlzLm5hKHRlbXAyKSB+ICIiLAogICAgICAgICAgIFRSVUUgfiB0ZW1wMSkpICU+JQogIG11dGF0ZShgWW91bmdlciBjaGlsZHJlbiwgNC02eSAoMi1mYWN0b3Igc29sdXRpb24pYCA9IHRlbXAzKSAlPiUKICBzZWxlY3QoLXN0YXJ0c193aXRoKCJ0ZW1wIikpICU+JQogICMgZGVhbCB3aXRoIHlvdW5nZXIgY2hpbGRyZW4sIDMtZmFjdG9yIHNvbHV0aW9uCiAgbXV0YXRlKHRlbXAxID0gYFlvdW5nZXIgY2hpbGRyZW4sIDQtNnkgKDMtZmFjdG9yIHNvbHV0aW9uKWAsCiAgICAgICAgIHRlbXAyID0gZ3N1YigiXFwqIiwgIiIsIHRlbXAxKSwKICAgICAgICAgdGVtcDMgPSBjYXNlX3doZW4oCiAgICAgICAgICAgdGVtcDIgPT0gYEFkdWx0c2AgfCAKICAgICAgICAgICAgIHRlbXAyID09IGBPbGRlciBjaGlsZHJlbiwgNy05eWAgfAogICAgICAgICAgICAgKGlzLm5hKGBBZHVsdHNgKSAmIGlzLm5hKGBPbGRlciBjaGlsZHJlbiwgNy05eWApKSB+ICLinJMiLAogICAgICAgICAgIGlzLm5hKHRlbXAyKSB+ICIiLAogICAgICAgICAgIFRSVUUgfiB0ZW1wMSkpICU+JQogIG11dGF0ZShgWW91bmdlciBjaGlsZHJlbiwgNC02eSAoMy1mYWN0b3Igc29sdXRpb24pYCA9IHRlbXAzKSAlPiUKICBzZWxlY3QoLXN0YXJ0c193aXRoKCJ0ZW1wIikpICU+JQogIG11dGF0ZV9hdCh2YXJzKGBBZHVsdHNgLCBgT2xkZXIgY2hpbGRyZW4sIDctOXlgKSwKICAgICAgICAgICAgZnVucyhpZmVsc2UoaXMubmEoLiksICIiLCAi4pyTIikpKSAlPiUKICBtdXRhdGVfYXQodmFycyhzdGFydHNfd2l0aCgiWW91bmdlciIpKSwKICAgICAgICAgICAgZnVucyhpZmVsc2UoaXMubmEoLiksICIiLCAuKSkpICU+JQogIHJlbmFtZShDYXBhY2l0eSA9IGNhcGFjaXR5LAogICAgICAgICBgMy1mYWN0b3Igc29sdXRpb25gID0gYFlvdW5nZXIgY2hpbGRyZW4sIDQtNnkgKDMtZmFjdG9yIHNvbHV0aW9uKWAsCiAgICAgICAgIGAyLWZhY3RvciBzb2x1dGlvbmAgPSBgWW91bmdlciBjaGlsZHJlbiwgNC02eSAoMi1mYWN0b3Igc29sdXRpb24pYCkgJT4lCiAga2FibGUoZm9ybWF0ID0gImh0bWwiLAogICAgICAgIGNhcHRpb24gPSAiVGFibGUgNC4zOiBTY2FsZXMgZm9yIGVhY2ggb2YgdGhlIGNvbmNlcHR1YWwgdW5pdHMgKGZhY3RvcnMpIGlkZW50aWZpZWQgYnkgRUZBIGZvciBVUyBBZHVsdHMsIG9sZGVyIGNoaWxkcmVuLCBhbmQgeW91bmdlciBjaGlsZHJlbiBpbiBTdHVkeSAzIChzZWUgQ2hhcHRlciBJSUkpLiBGb3IgeW91bmdlciBjaGlsZHJlbiwgdGhpcyBpbmNsdWRlcyBzY2FsZXMgZm9yIGJvdGggdGhyZWUtIGFuZCB0d28tZmFjdG9yIEVGQSBzb2x1dGlvbnMuIEEgY2hlY2ttYXJrIGluZGljYXRlcyB0aGF0IGEgbWVudGFsIGNhcGFjaXR5IHdhcyBpbmNsdWRlZCBpbiBhIHNjYWxlIGZvciBhIHBhcnRpY3VsYXIgc2FtcGxlLiBUaGUgY29uY2VwdHVhbCB1bml0cyBvZiB5b3VuZ2VyIGNoaWxkcmVuIGRpZmZlcmVkIHN1YnN0YW50aWFsbHkgZnJvbSB0aG9zZSBvZiBvbGRlciBjaGlsZHJlbiBhbmQgYWR1bHRzLCBzdWNoIHRoYXQgc29tZSBtZW50YWwgY2FwYWNpdGllcyB3ZXJlIGluY2x1ZGVkIGluIGRpZmZlcmVudCBzY2FsZXMgYWNyb3NzIGFnZSBncm91cHMgKGUuZy4sIGZlZWwgc2NhcmVkIHdhcyBwYXJ0IG9mIHRoZSBCT0RZIHNjYWxlIGZvciBvbGRlciBjaGlsZHJlbiBhbmQgYWR1bHRzLCBidXQgcGFydCBvZiB0aGUgSEVBUlQqIHNjYWxlIGZvciB5b3VuZ2VyIGNoaWxkcmVuKS4gSW4gdGhlc2UgY2FzZXMsIHRoZSBuYW1lIG9mIHRoZSBzY2FsZSBpcyBwcm92aWRlZCAocmF0aGVyIHRoYW4gYSBjaGVja21hcmspLiIpICU+JQogIGthYmxlX3N0eWxpbmcoKSAlPiUKICBncm91cF9yb3dzKCJCT0RZIHNjYWxlIiwgMSwgNykgJT4lCiAgZ3JvdXBfcm93cygiSEVBUlQgc2NhbGUiLCA4LCAxNCkgJT4lCiAgZ3JvdXBfcm93cygiTUlORCBzY2FsZSIsIDE1LCAyMCkgJT4lCiAgYWRkX2hlYWRlcl9hYm92ZShjKCIgIiA9IDMsCiAgICAgICAgICAgICAgICAgICAgICJZb3VuZ2VyIGNoaWxkcmVuLCA0LTZ5IiA9IDIpKQpgYGAKCmBgYHtyIHRhYmxlNC4zLCBpbmNsdWRlID0gVH0KdGFibGU0LjMKYGBgCgpgYGB7cn0KcGxvdHNfYWdlZ3BfZDNfc2NvcmVkX2FkIDwtIHJlbHZpel9hZ2VncF9mdW4oCiAgZF9zY29yZWQgPSBkM19hZF9zY29yZWRfYWQgJT4lIAogICAgZnVsbF9qb2luKGQzXzc5X3Njb3JlZF9hZCkgJT4lIAogICAgZnVsbF9qb2luKGQzXzQ2X3Njb3JlZF9hZCksIAogIGFnZV9ncm91cHMgPSBjKCJjaGlsZHJlbjQ2IiwgImNoaWxkcmVuNzkiLCAiYWR1bHRzIiksCiAgYWdlX2dyb3VwX2xhYmVscyA9IGMoIkNoaWxkcmVuLCAoNC02eSkiLCAiQ2hpbGRyZW4gKDctOXkpIiwgIkFkdWx0cyIpLAogIGNvbG9ycyA9IGNvbG9yczA5KQpgYGAKCmBgYHtyfQpmaWdfZDNfYWxsX3Njb3JlZF9hZF9wbG90cyA8LSBwbG90X2dyaWQocGxvdHNfYWdlZ3BfZDNfc2NvcmVkX2FkW1sxXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RzX2FnZWdwX2QzX3Njb3JlZF9hZFtbMl1dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90c19hZ2VncF9kM19zY29yZWRfYWRbWzNdXSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiRDEiLCAiRDIiLCAiRDMiKSwgbmNvbCA9IDMpCgpmaWdfZDNfYWxsX3Njb3JlZF9hZF9sZWcgPC0gZ2V0X2xlZ2VuZCgKICBwbG90c19hZ2VncF9kM19zY29yZWRfYWRbWzFdXSArCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikgKwogICAgc2NhbGVfY29sb3JfbWFudWFsKCJUYXJnZXQgY2hhcmFjdGVyIiwgdmFsdWVzID0gY29sb3JzMDksCiAgICAgICAgICAgICAgICAgICAgICAgbmEudHJhbnNsYXRlID0gRiwKICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZCh0aXRsZS5wb3NpdGlvbiA9ICJsZWZ0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDkpKSkKCmZpZ19kM19hbGxfc2NvcmVkX2FkX3Bsb3RzX2xlZyA8LSBwbG90X2dyaWQoCiAgZmlnX2QzX2FsbF9zY29yZWRfYWRfcGxvdHMsIGZpZ19kM19hbGxfc2NvcmVkX2FkX2xlZywKICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDEsIDAuMDUpKQoKZmlnX2QzX2FsbF9zY29yZWRfYWRfdGl0bGUgPC0gZ2dkcmF3KCkgKyAKICBkcmF3X2xhYmVsKCJUcmFja2luZyBkZXZlbG9wbWVudCBiZXR3ZWVuIDQtOXkgYW5kIGFkdWx0aG9vZCAoc2NvcmVkIHVzaW5nIGFkdWx0cycgc2NhbGVzKSIsIHNpemUgPSAxNiwgZm9udGZhY2UgPSAnYm9sZCcsIHggPSAwLCBoanVzdCA9IDApCgpmaWdfZDNfYWxsX3Njb3JlZF9hZF9wbG90c19sZWdfdGl0bGUgPC0gcGxvdF9ncmlkKAogIGZpZ19kM19hbGxfc2NvcmVkX2FkX3RpdGxlLCBmaWdfZDNfYWxsX3Njb3JlZF9hZF9wbG90c19sZWcsCiAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygwLjEyLCAxKSkKYGBgCgpgYGB7cn0KZmlndXJlNC44IDwtIHBsb3RfZ3JpZChmaWdfZDNfYWRfcGxvdHNfbGVnX3RpdGxlLCAKICAgICAgICAgICAgICAgICAgICAgICBmaWdfZDNfNzlfc2NvcmVkX2FkX3Bsb3RzX2xlZ190aXRsZSwKICAgICAgICAgICAgICAgICAgICAgICBmaWdfZDNfNDZfc2NvcmVkX2FkX3Bsb3RzX2xlZ190aXRsZSwgCiAgICAgICAgICAgICAgICAgICAgICAgZmlnX2QzX2FsbF9zY29yZWRfYWRfcGxvdHNfbGVnX3RpdGxlLAogICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxKQoKZmlndXJlNC44X2NhcCA8LSBhZGRfc3ViKGZpZ3VyZTQuOCwgc3RyX3dyYXAoIkZpZ3VyZSA0Ljg6IFJlbGF0aW9uc2hpcHMgYW1vbmcgVVMgYWR1bHRzJywgb2xkZXIgY2hpbGRyZW4ncywgYW5kIHlvdW5nZXIgY2hpbGRyZW4ncyBhdHRyaWJ1dGlvbnMgb2YgY29uY2VwdHVhbCB1bml0cyBpbiBTdHVkeSAzLCBzY29yZWQgdXNpbmcgYWR1bHRzJyBCT0RZLCBIRUFSVCwgYW5kIE1JTkQgc2NhbGVzIChzZWUgVGFibGUgNC4zKS4gKEEpIEFkdWx0cy4gKEIpIE9sZGVyIGNoaWxkcmVuICg3LTl5IG9mIGFnZSkuIChDKSBZb3VuZ2VyIGNoaWxkcmVuICg0LTZ5IG9mIGFnZSkuIChEKSBBIHZpc3VhbGl6YXRpb24gb2YgZGV2ZWxvcG1lbnQgYmV0d2VlbiA0LTl5IGFuZCBhZHVsdGhvb2QsIHVzaW5nIG1lYW4gc2NvcmVzIGJ5IGNoYXJhY3RlciBhbmQgYWdlIGdyb3VwLiBQbG90cyBhcmUgb3JnYW5pemVkIGJ5IHNhbXBsZSAocm93cykgYW5kIGJ5IHBhaXIgb2YgY29uY2VwdHVhbCB1bml0cyAoY29sdW1ucykuIEZvciBlYWNoIGNvbmNlcHR1YWwgdW5pdCwgc2NvcmVzIGNvdWxkIHJhbmdlIGZyb20gMC0xLiBJbiBwYW5lbHMgQS1DLCBpbmRpdmlkdWFsIHBhcnRpY2lwYW50cyBhcmUgcGxvdHRlZCBhcyBzbWFsbCwgdHJhbnNsdWNlbnQgY2lyY2xlcywgYW5kIG1lYW4gc2NvcmVzIGJ5IGNoYXJhY3RlciBhcmUgcGxvdHRlZCBhcyBsYXJnZXIsIHNvbGlkIGRpYW1vbmRzLiBFcnJvciBiYXJzIGFyZSA5NSUgYm9vdHN0cmFwcGVkIGNvbmZpZGVuY2UgaW50ZXJ2YWxzLiBUaGUgZG90dGVkIGxpbmUgY29ycmVzcG9uZHMgdG8gZXF1YWwgZW5kb3JzZW1lbnRzIG9mIHRoZSB0d28gY29uY2VwdHVhbCB1bml0cyBwbG90dGVkLiIsIDExMCksIHggPSAwLCBoanVzdCA9IDApCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBULCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMS44fQpnZ2RyYXcoZmlndXJlNC44X2NhcCkKYGBgCgpgYGB7cn0KZmlndXJlNC45IDwtIHBsb3RfZ3JpZChmaWdfZDNfNzlfc2NvcmVkXzc5X3Bsb3RzX2xlZ190aXRsZSwgCiAgICAgICAgICAgICAgICAgICAgICAgZmlnX2QzXzQ2X3Njb3JlZF80Nl93ZG1fcGxvdHNfbGVnX3RpdGxlLAogICAgICAgICAgICAgICAgICAgICAgIGZpZ19kM180Nl9zY29yZWRfNDZfcGFyX3Bsb3RzX2xlZ190aXRsZSwKICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSkKCmZpZ3VyZTQuOV9jYXAgPC0gYWRkX3N1YihmaWd1cmU0LjksIHN0cl93cmFwKCJGaWd1cmUgNC45OiBSZWxhdGlvbnNoaXBzIGFtb25nIG9sZGVyIGFuZCB5b3VuZ2VyIGNoaWxkcmVuJ3MgYXR0cmlidXRpb25zIG9mIGNvbmNlcHR1YWwgdW5pdHMgaW4gU3R1ZHkgMywgc2NvcmVkIHVzaW5nIHRoZWlyIG93biBzY2FsZXMgKHNlZSBUYWJsZSA0LjMpLiBGb3IgeW91bmdlciBjaGlsZHJlbiAoNC02eSBvZiBhZ2UpLCB0d28gc2V0cyBvZiBzY29yZXMgYXJlIHByZXNlbnRlZDogdXNpbmcgYSB0aHJlZS1mYWN0b3IgRUZBIHNvbHV0aW9uIChCMS1CMykgYW5kIHVzaW5nIGEgdHdvLWZhY3RvciBFRkEgc29sdXRpb24gKEMxLUMzKS4gUGxvdHMgYXJlIG9yZ2FuaXplZCBieSBzYW1wbGUgYW5kIHNjYWxlIHVzZWQgKHJvd3MpIGFuZCBieSBwYWlyIG9mIGNvbmNlcHR1YWwgdW5pdHMgKGNvbHVtbnMpLiBGb3IgZWFjaCBjb25jZXB0dWFsIHVuaXQsIHNjb3JlcyBjb3VsZCByYW5nZSBmcm9tIDAtMS4gSW5kaXZpZHVhbCBwYXJ0aWNpcGFudHMgYXJlIHBsb3R0ZWQgYXMgc21hbGwsIHRyYW5zbHVjZW50IGNpcmNsZXMsIGFuZCBtZWFuIHNjb3JlcyBieSBjaGFyYWN0ZXIgYXJlIHBsb3R0ZWQgYXMgbGFyZ2VyLCBzb2xpZCBkaWFtb25kcy4gRXJyb3IgYmFycyBhcmUgOTUlIGJvb3RzdHJhcHBlZCBjb25maWRlbmNlIGludGVydmFscy4gVGhlIGRvdHRlZCBsaW5lIGNvcnJlc3BvbmRzIHRvIGVxdWFsIGVuZG9yc2VtZW50cyBvZiB0aGUgdHdvIGNvbmNlcHR1YWwgdW5pdHMgcGxvdHRlZC4iLCAxMTApLCB4ID0gMCwgaGp1c3QgPSAwKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gVCwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDEuNH0KZ2dkcmF3KGZpZ3VyZTQuOV9jYXApCmBgYAoKYGBge3J9CmZpZ3VyZTQuMTBfcGxvdHMgPC0gcGxvdF9ncmlkKAogIHBsb3RfZDNfYWRfc2NvcmVkX2FkX2RpZmYgKwogICAgbGFicyh0aXRsZSA9ICJTdHVkeSAzOiBBZHVsdHMiKSArCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogIHBsb3RfZDNfNzlfc2NvcmVkX2FkX2RpZmYgKwogICAgbGFicyh0aXRsZSA9ICJTdHVkeSAzOiBDaGlsZHJlbiwgNy05eSAoc2NvcmVkIHVzaW5nIGFkdWx0cycgc2NhbGVzKSIpICsKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgcGxvdF9kM180Nl9zY29yZWRfYWRfZGlmZiArIAogICAgbGFicyh0aXRsZSA9ICJTdHVkeSAzOiBDaGlsZHJlbiwgNC02eSAoc2NvcmVkIHVzaW5nIGFkdWx0cycgc2NhbGVzKSIpICsKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksIAogIG5jb2wgPSAzLCByZWxfd2lkdGhzID0gYygxLCAxLCAxKSwKICBsYWJlbHMgPSAiQVVUTyIpCgpmaWd1cmU0LjEwX3Bsb3RzX2xlZyA8LSBwbG90X2dyaWQoZmlndXJlNC4xMF9wbG90cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9sZWdlbmQocGxvdF9kM19hZF9zY29yZWRfYWRfZGlmZiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDEsIDAuMSkpCgpmaWd1cmU0LjEwX2NhcCA8LSBhZGRfc3ViKGZpZ3VyZTQuMTBfcGxvdHNfbGVnLCBzdHJfd3JhcCgiRmlndXJlIDQuMTA6IERpZmZlcmVuY2Ugc2NvcmVzIGJldHdlZW4gVVMgYWR1bHRzJyBhbmQgY2hpbGRyZW4ncyBhdHRyaWJ1dGlvbnMgb2YgY29uY2VwdHVhbCB1bml0cyBpbiBTdHVkeSAzLiB0aGlzIGluY2x1ZGVzIGRpZmZlcmVuY2Ugc2NvcmVzIHVzaW5nIGFkdWx0cycgQk9EWSwgSEVBUlQsIGFuZCBNSU5EIHNjYWxlcyAocGFuZWwgQikgYW5kIGRpZmZlcmVuY2Ugc2NvcmVzIHVzaW5nIGNoaWxkcmVuJ3Mgb3duIHNjYWxlcyAocGFuZWwgQzsgc2VlIFRhYmxlIDQuMykuIEZvciBlYWNoIGNvbmNlcHR1YWwgdW5pdCwgc2NvcmVzIGNvdWxkIHJhbmdlIGZyb20gMC0xLCBzdWNoIHRoYXQgZGlmZmVyZW5jZSBzY29yZXMgY291bGQgcmFuZ2UgZnJvbSAtMSB0byArMS4gSW5kaXZpZHVhbCBwYXJ0aWNpcGFudHMgYXJlIHBsb3R0ZWQgYXMgc21hbGwsIHRyYW5zbHVjZW50IGNpcmNsZXMsIGFuZCBtZWFuIGRpZmZlcmVuY2Ugc2NvcmVzIGJ5IGNoYXJhY3RlciBhcmUgcGxvdHRlZCBhcyBsYXJnZXIsIHNvbGlkIGRpYW1vbmRzLiBFcnJvciBiYXJzIGFyZSA5NSUgYm9vdHN0cmFwcGVkIGNvbmZpZGVuY2UgaW50ZXJ2YWxzLiBUaGUgZG90dGVkIGxpbmUgY29ycmVzcG9uZHMgdG8gZXF1YWwgZW5kb3JzZW1lbnRzIG9mIHRoZSB0d28gY29uY2VwdHVhbCB1bml0cyBwbG90dGVkIChpLmUuLCBhIGRpZmZlcmVuY2Ugc2NvcmUgb2YgMCkuIiwgMTgwKSwgeCA9IDAsIGhqdXN0ID0gMCkKYGBgCgpgYGB7ciwgaW5jbHVkZSA9IFQsIGZpZy53aWR0aCA9IDgsIGZpZy5hc3AgPSAwLjM4fQpnZ2RyYXcoZmlndXJlNC4xMF9jYXApCmBgYAoKYGBge3J9CmZpZ3VyZTQuMTFfcGxvdHMgPC0gcGxvdF9ncmlkKAogIHBsb3RfZDNfNzlfc2NvcmVkXzc5X2RpZmYgKwogICAgbGFicyh0aXRsZSA9ICJTdHVkeSAzOiBDaGlsZHJlbiwgNy05eVxuKHNjb3JlZCB1c2luZyB0aGVpciBvd24gc2NhbGVzKSIpICsKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgcGxvdF9kM180Nl9zY29yZWRfNDZfd2RtX2RpZmYgKyAKICAgIGxhYnModGl0bGUgPSAiU3R1ZHkgMzogQ2hpbGRyZW4sIDQtNnlcbihzY29yZWQgdXNpbmcgdGhlaXIgb3duIHNjYWxlcywgMy1mYWN0b3Igc29sdXRpb24pIikgKwogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwgCiAgcGxvdF9kM180Nl9zY29yZWRfNDZfcGFyX2RpZmYgKyAKICAgIGxhYnModGl0bGUgPSAiU3R1ZHkgMzogQ2hpbGRyZW4sIDQtNnlcbihzY29yZWQgdXNpbmcgdGhlaXIgb3duIHNjYWxlcywgMi1mYWN0b3Igc29sdXRpb24pIikgKwogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwgCiAgbmNvbCA9IDMsIHJlbF93aWR0aHMgPSBjKDEsIDEsIDAuOCksCiAgbGFiZWxzID0gIkFVVE8iKQoKZmlndXJlNC4xMV9wbG90c19sZWcgPC0gcGxvdF9ncmlkKGZpZ3VyZTQuMTFfcGxvdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfbGVnZW5kKHBsb3RfZDNfNzlfc2NvcmVkXzc5X2RpZmYpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygxLCAwLjEpKQoKZmlndXJlNC4xMV9jYXAgPC0gYWRkX3N1YihmaWd1cmU0LjExX3Bsb3RzX2xlZywgc3RyX3dyYXAoIkZpZ3VyZSA0LjExOiBEaWZmZXJlbmNlIHNjb3JlcyBiZXR3ZWVuIDctIHRvIDkteWVhci1vbGQgY2hpbGRyZW4ncyBhbmQgNC0gdG8gNi15ZWFyLW9sZCBjaGlsZHJlbidzIGF0dHJpYnV0aW9ucyBvZiBjb25jZXB0dWFsIHVuaXRzIGluIFN0dWR5IDMsIHVzaW5nIHRoZWlyIG93biBzY2FsZXMuIEZvciB5b3VuZ2VyIGNoaWxkcmVuICg0LTZ5IG9mIGFnZSksIHRoaXMgaW5jbHVkZXMgZGlmZmVyZW5jZSBzY29yZXMgdXNpbmcgdGhlIHRocmVlLWZhY3RvciBFRkEgc29sdXRpb24gKHBhbmVsIEIpIGFuZCBkaWZmZXJlbmNlIHNjb3JlcyB1c2luZyB0aGUgdHdvLWZhY3RvciBzb2x1dGlvbiAocGFuZWwgQzsgc2VlIFRhYmxlIDQuMykuIEZvciBlYWNoIGNvbmNlcHR1YWwgdW5pdCwgc2NvcmVzIGNvdWxkIHJhbmdlIGZyb20gMC0xLCBzdWNoIHRoYXQgZGlmZmVyZW5jZSBzY29yZXMgY291bGQgcmFuZ2UgZnJvbSAtMSB0byArMS4gSW5kaXZpZHVhbCBwYXJ0aWNpcGFudHMgYXJlIHBsb3R0ZWQgYXMgc21hbGwsIHRyYW5zbHVjZW50IGNpcmNsZXMsIGFuZCBtZWFuIGRpZmZlcmVuY2Ugc2NvcmVzIGJ5IGNoYXJhY3RlciBhcmUgcGxvdHRlZCBhcyBsYXJnZXIsIHNvbGlkIGRpYW1vbmRzLiBFcnJvciBiYXJzIGFyZSA5NSUgYm9vdHN0cmFwcGVkIGNvbmZpZGVuY2UgaW50ZXJ2YWxzLiBUaGUgZG90dGVkIGxpbmUgY29ycmVzcG9uZHMgdG8gZXF1YWwgZW5kb3JzZW1lbnRzIG9mIHRoZSB0d28gY29uY2VwdHVhbCB1bml0cyBwbG90dGVkIChpLmUuLCBhIGRpZmZlcmVuY2Ugc2NvcmUgb2YgMCkuIiwgMTgwKSwgeCA9IDAsIGhqdXN0ID0gMCkKYGBgCgpgYGB7ciwgaW5jbHVkZSA9IFQsIGZpZy53aWR0aCA9IDgsIGZpZy5hc3AgPSAwLjM4fQpnZ2RyYXcoZmlndXJlNC4xMV9jYXApCmBgYAoKCiMgU3R1ZHkgNDogQSBmb2N1cyBvbiBlYXJseSBjaGlsZGhvb2QgKDQtNXkpCgpJbiBTdHVkeSA0LCBgciBucm93KGQ0X2FkX3dpZGUpLzJgIFVTIGFkdWx0cyBhbmQgYHIgbnJvdyhkNF80Nl93aWRlKS8yYCBVUyBjaGlsZHJlbiBiZXR3ZWVuIHRoZSBhZ2VzIG9mIGByIHN1bW1hcnkoZDRfNDYkYWdlKVsiTWluLiJdICU+JSByb3VuZCgyKWAtYHIgc3VtbWFyeShkNF80NiRhZ2UpWyJNYXguIl0gJT4lIHJvdW5kKDIpYCB5ZWFycyAobWVkaWFuOiBgciBzdW1tYXJ5KGQ0XzQ2JGFnZSlbIk1lZGlhbiJdICU+JSByb3VuZCgyKWB5KSBlYWNoIGFzc2Vzc2VkIHR3byB0YXJnZXQgY2hhcmFjdGVycyBvbiAxOCBtZW50YWwgY2FwYWNpdGllcy4gVG8gbWFrZSB0aGUgc3R1ZHkgYXBwcm9wcmlhdGUgZm9yIGNoaWxkcmVuIGluIHRoaXMgYWdlIHJhbmdlLCB0aGlzIHN0dWR5IGVtcGxveWVkIGEgbmV3IHNldCBvZiAxOCBtZW50YWwgY2FwYWNpdGllcyAoc29tZSBidXQgbm90IGFsbCBvZiB3aGljaCB3ZXJlIHVzZWQgaW4gU3R1ZGllcyAxLTMpLiBJbiBhZGRpdGlvbiwgcGFydGljaXBhbnRzIHdlcmUgcHJlc2VudGVkIHdpdGggYSBtb3JlIGNoaWxkLWZyaWVuZGx5IHZpc3VhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgMy1wb2ludCByZXNwb25zZSBzY2FsZSAoIm5vLCIgY29kZWQgYXMgMDsgImtpbmRhLCIgY29kZWQgYXMgMC41LCAieWVzLCIgY29kZWQgYXMgMSkuIFRoaXMgc3R1ZHkgZW1wbG95ZWQgdGhlICJlZGdlIGNhc2UiIHZhcmlhbnQgb2YgdGhlIGdlbmVyYWwgYXBwcm9hY2gsIHdpdGggcGFydGljaXBhbnRzIGFzc2Vzc2luZyBib3RoIGEgYmVldGxlIG9yIGEgcm9ib3QgaW4gc2VxdWVuY2UgKHdpdGggb3JkZXIgY291bnRlcmJhbGFuY2VkIGFjcm9zcyBwYXJ0aWNpcGFudHMpLiAoU2VlIENoYXB0ZXIgSUkgZm9yIGRldGFpbGVkIG1ldGhvZHMuKQoKIyMgU3BlY2lhbCBub3RlcyBvbiBkYXRhIHByb2Nlc3NpbmcgYW5kIGFuYWx5c2lzCgojIyBSZXN1bHRzCgojIyMgQWR1bHRzCgojIyMjIFNjYWxlIGNvbnN0cnVjdGlvbgoKYGBge3J9CnNjYWxlc19lZmFfd2RtX2Q0X2FkIDwtIHNjYWxlX2Z1bihlZmFfd2RtX2Q0X2FkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JfbmFtZXMgPSBmYWN0b3JfbmFtZXNfZWZhX3dkbV9kNF9hZCkKZDRfYWRfc2NvcmVkX2FkIDwtIHNjb3JlX2Z1bihkNF9hZCwgc2NhbGVzX2VmYV93ZG1fZDRfYWQpCgpzYXZlUkRTKHNjYWxlc19lZmFfd2RtX2Q0X2FkLCBmaWxlID0gIi4vc2NhbGVzL3NjYWxlc19lZmFfd2RtX2Q0X2FkIikKc2F2ZVJEUyhkNF9hZF9zY29yZWRfYWQsIGZpbGUgPSAiLi9zY29yZWRfZGF0YS9kNF9hZF9zY29yZWRfYWQiKQpgYGAKCkZvbGxvd2luZyB0aGUgc3RlcHMgZGVzY3JpYmVkIGluICJHZW5lcmFsIGFuYWx5c2lzIHBsYW4sIiBhYm92ZSwgeWllbGRlZCBgciBmYWN0X25hbWVfZnVuKGZhY3Rvcl9uYW1lc19lZmFfd2RtX2Q0X2FkKWAgc2NhbGVzIG9mIGByIHNjYWxlc19lZmFfd2RtX2Q0X2FkICU+JSBjb3VudChmYWN0b3IpICU+JSBzdW1tYXJpc2UobWVhbiA9IG1lYW4obikpICU+JSBzZWxlY3QobWVhbikgJT4lIGFzLm51bWVyaWMoKWAgaXRlbXMgZWFjaDsgc2VlIFRhYmxlIDQuNC4KCiMjIyMgVmlzdWFsaXphdGlvbgoKWFgKCmBgYHtyfQpwbG90c19kNF9hZF9zY29yZWRfYWQgPC0gcmVsdml6X2Z1bihkNF9hZF9zY29yZWRfYWQsIGNvbG9ycyA9IGNvbG9yczAyKQpgYGAKCmBgYHtyfQpmaWdfZDRfYWRfcGxvdHMgPC0gcGxvdF9ncmlkKHBsb3RzX2Q0X2FkX3Njb3JlZF9hZFtbMV1dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RzX2Q0X2FkX3Njb3JlZF9hZFtbMl1dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RzX2Q0X2FkX3Njb3JlZF9hZFtbM11dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkExIiwgIkEyIiwgIkEzIiksIG5jb2wgPSAzKQoKZmlnX2Q0X2FkX2xlZyA8LSBnZXRfbGVnZW5kKAogIHBsb3RzX2Q0X2FkX3Njb3JlZF9hZFtbMV1dICsKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLCBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKSArCiAgICBzY2FsZV9maWxsX21hbnVhbCgiVGFyZ2V0IGNoYXJhY3RlciIsIHZhbHVlcyA9IGNvbG9yczAyLAogICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQodGl0bGUucG9zaXRpb24gPSAibGVmdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDIpKSArCiAgICBzY2FsZV9jb2xvcl9tYW51YWwoIlRhcmdldCBjaGFyYWN0ZXIiLCB2YWx1ZXMgPSBjb2xvcnMwMiwKICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZCh0aXRsZS5wb3NpdGlvbiA9ICJsZWZ0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDIpKSkKCmZpZ19kNF9hZF9wbG90c19sZWcgPC0gcGxvdF9ncmlkKGZpZ19kNF9hZF9wbG90cywgZmlnX2Q0X2FkX2xlZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygxLCAwLjA1KSkKCmZpZ19kNF9hZF90aXRsZSA8LSBnZ2RyYXcoKSArIAogIGRyYXdfbGFiZWwoIlN0dWR5IDQ6IEFkdWx0cyIsIHNpemUgPSAxNiwgZm9udGZhY2UgPSAnYm9sZCcsIHggPSAwLCBoanVzdCA9IDApCgpmaWdfZDRfYWRfcGxvdHNfbGVnX3RpdGxlIDwtIHBsb3RfZ3JpZChmaWdfZDRfYWRfdGl0bGUsIGZpZ19kNF9hZF9wbG90c19sZWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMC4xMiwgMSkpCmBgYAoKIyMjIyBBbmFseXNpcyBvZiBhc3ltbWV0cmllcwoKWFgKCmBgYHtyfQpkNF9hZF9zY29yZWRfYWRfZGlmZiA8LSBkaWZmX2Z1bihkNF9hZF9zY29yZWRfYWQpCnNhdmVSRFMoZDRfYWRfc2NvcmVkX2FkX2RpZmYsICIuL2RpZmZzY29yZV9kYXRhL2Q0X2FkX3Njb3JlZF9hZF9kaWZmIikKYGBgCgpgYGB7cn0KcGxvdF9kNF9hZF9zY29yZWRfYWRfZGlmZiA8LSBkaWZmcGxvdF9mdW4oZDRfYWRfc2NvcmVkX2FkX2RpZmYsIGNvbG9yczAyKQpgYGAKCmBgYHtyfQojIHJfZDRfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCA8LSBicm0oCiMgICBkaWZmIH4gMSArICgxIHwgY2hhcmFjdGVyKSArICgxIHwgc3ViaWQpLAojICAgZGF0YSA9IGQ0X2FkX3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIEhFQVJUIiksCiMgICBjb250cmFzdHMgPSBsaXN0KGNoYXJhY3RlciA9IGNvbnRyYXN0c19zdW1fZWRnZSksCiMgICBjb3JlcyA9IDQsIGNvbnRyb2wgPSBsaXN0KGFkYXB0X2RlbHRhID0gMC45OTkpKQoKIyByX2Q0X2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQgPC0gbG1lcigKIyAgIGRpZmYgfiAxICsgKDEgfCBjaGFyYWN0ZXIpICsgKDEgfCBzdWJpZCksCiMgICBkYXRhID0gZDRfYWRfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gSEVBUlQiKSwKIyAgIGNvbnRyYXN0cyA9IGxpc3QoY2hhcmFjdGVyID0gY29udHJhc3RzX3N1bV9lZGdlKSkKCnJfZDRfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCA8LSBsbWVyKAogIGRpZmYgfiAxICsgY2hhcmFjdGVyICsgKDEgfCBzdWJpZCksCiAgZGF0YSA9IGQ0X2FkX3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIEhFQVJUIiksCiAgY29udHJhc3RzID0gbGlzdChjaGFyYWN0ZXIgPSBjb250cmFzdHNfc3VtX2VkZ2UpKQoKIyByX2Q0X2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQgPC0gbG1lcigKIyAgIGRpZmYgfiAxICsgKDEgfCBzdWJpZCksCiMgICBkYXRhID0gZDRfYWRfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gSEVBUlQiKSkKCnN1bW1hcnkocl9kNF9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUKQpgYGAKCmBgYHtyfQojIHJfZDRfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIDwtIGJybSgKIyAgIGRpZmYgfiAxICsgKDEgfCBjaGFyYWN0ZXIpICsgKDEgfCBzdWJpZCksCiMgICBkYXRhID0gZDRfYWRfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gTUlORCIpLAojICAgY29udHJhc3RzID0gbGlzdChjaGFyYWN0ZXIgPSBjb250cmFzdHNfc3VtX2VkZ2UpLAojICAgY29yZXMgPSA0LCBjb250cm9sID0gbGlzdChhZGFwdF9kZWx0YSA9IDAuOTk5KSkKCiMgcl9kNF9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQgPC0gbG1lcigKIyAgIGRpZmYgfiAxICsgKDEgfCBjaGFyYWN0ZXIpICsgKDEgfCBzdWJpZCksCiMgICBkYXRhID0gZDRfYWRfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gTUlORCIpLAojICAgY29udHJhc3RzID0gbGlzdChjaGFyYWN0ZXIgPSBjb250cmFzdHNfc3VtX2VkZ2UpKQoKcl9kNF9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQgPC0gbG1lcigKICBkaWZmIH4gMSArIGNoYXJhY3RlciArICgxIHwgc3ViaWQpLAogIGRhdGEgPSBkNF9hZF9zY29yZWRfYWRfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFkgLSBNSU5EIiksCiAgY29udHJhc3RzID0gbGlzdChjaGFyYWN0ZXIgPSBjb250cmFzdHNfc3VtX2VkZ2UpKQoKIyByX2Q0X2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCA8LSBsbWVyKAojICAgZGlmZiB+IDEgKyAoMSB8IHN1YmlkKSwKIyAgIGRhdGEgPSBkNF9hZF9zY29yZWRfYWRfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFkgLSBNSU5EIikpCgpzdW1tYXJ5KHJfZDRfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EKQpgYGAKCmBgYHtyfQojIHJfZDRfYWRfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCA8LSBicm0oCiMgICBkaWZmIH4gMSArICgxIHwgY2hhcmFjdGVyKSArICgxIHwgc3ViaWQpLAojICAgZGF0YSA9IGQ0X2FkX3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiSEVBUlQgLSBNSU5EIiksCiMgICBjb250cmFzdHMgPSBsaXN0KGNoYXJhY3RlciA9IGNvbnRyYXN0c19zdW1fZWRnZSksCiMgICBjb3JlcyA9IDQsIGNvbnRyb2wgPSBsaXN0KGFkYXB0X2RlbHRhID0gMC45OTkpKQoKIyByX2Q0X2FkX3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQgPC0gbG1lcigKIyAgIGRpZmYgfiAxICsgKDEgfCBjaGFyYWN0ZXIpICsgKDEgfCBzdWJpZCksCiMgICBkYXRhID0gZDRfYWRfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJIRUFSVCAtIE1JTkQiKSwKIyAgIGNvbnRyYXN0cyA9IGxpc3QoY2hhcmFjdGVyID0gY29udHJhc3RzX3N1bV9lZGdlKSkKCnJfZDRfYWRfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCA8LSBsbWVyKAogIGRpZmYgfiAxICsgY2hhcmFjdGVyICsgKDEgfCBzdWJpZCksCiAgZGF0YSA9IGQ0X2FkX3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiSEVBUlQgLSBNSU5EIiksCiAgY29udHJhc3RzID0gbGlzdChjaGFyYWN0ZXIgPSBjb250cmFzdHNfc3VtX2VkZ2UpKQoKIyByX2Q0X2FkX3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQgPC0gbG1lcigKIyAgIGRpZmYgfiAxICsgKDEgfCBzdWJpZCksCiMgICBkYXRhID0gZDRfYWRfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJIRUFSVCAtIE1JTkQiKSkKCnN1bW1hcnkocl9kNF9hZF9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EKQpgYGAKCiMjIyBDaGlsZHJlbiAoNC01eSkKCiMjIyMgU2NhbGUgY29uc3RydWN0aW9uCgpgYGB7cn0Kc2NhbGVzX2VmYV9wYXJfZDRfNDYgPC0gc2NhbGVfZnVuKGVmYV9wYXJfZDRfNDYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JfbmFtZXMgPSBmYWN0b3JfbmFtZXNfZWZhX3Bhcl9kNF80NikKc2NhbGVzX2VmYV93ZG1fZDRfNDYgPC0gc2NhbGVfZnVuKGVmYV93ZG1fZDRfNDYsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9uYW1lcyA9IGZhY3Rvcl9uYW1lc19lZmFfd2RtX2Q0XzQ2KQpkNF80Nl9zY29yZWRfYWQgPC0gc2NvcmVfZnVuKGQ0XzQ2LCBzY2FsZXNfZWZhX3dkbV9kNF9hZCkKZDRfNDZfc2NvcmVkXzQ2X3BhciA8LSBzY29yZV9mdW4oZDRfNDYsIHNjYWxlc19lZmFfcGFyX2Q0XzQ2KQpkNF80Nl9zY29yZWRfNDZfd2RtIDwtIHNjb3JlX2Z1bihkNF80Niwgc2NhbGVzX2VmYV93ZG1fZDRfNDYpCgpzYXZlUkRTKHNjYWxlc19lZmFfd2RtX2Q0XzQ2LCBmaWxlID0gIi4vc2NhbGVzL3NjYWxlc19lZmFfd2RtX2Q0XzQ2IikKc2F2ZVJEUyhkNF80Nl9zY29yZWRfYWQsIGZpbGUgPSAiLi9zY29yZWRfZGF0YS9kNF80Nl9zY29yZWRfYWQiKQpzYXZlUkRTKGQ0XzQ2X3Njb3JlZF80Nl9wYXIsIGZpbGUgPSAiLi9zY29yZWRfZGF0YS9kNF80Nl9zY29yZWRfNDZfcGFyIikKc2F2ZVJEUyhkNF80Nl9zY29yZWRfNDZfd2RtLCBmaWxlID0gIi4vc2NvcmVkX2RhdGEvZDRfNDZfc2NvcmVkXzQ2X3dkbSIpCmBgYAoKIyMjIyMgVGhyZWUtZmFjdG9yIHNvbHV0aW9uCgpGb2xsb3dpbmcgdGhlIHN0ZXBzIGRlc2NyaWJlZCBpbiAiR2VuZXJhbCBhbmFseXNpcyBwbGFuLCIgYWJvdmUsIHlpZWxkZWQgYHIgZmFjdF9uYW1lX2Z1bihmYWN0b3JfbmFtZXNfZWZhX3Bhcl9kNF80NilgIHNjYWxlcyBvZiBgciBzY2FsZXNfZWZhX3Bhcl9kNF80NiAlPiUgY291bnQoZmFjdG9yKSAlPiUgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKG4pKSAlPiUgc2VsZWN0KG1lYW4pICU+JSBhcy5udW1lcmljKClgIGl0ZW1zIGVhY2g7IHNlZSBUYWJsZSA0LjQuCgojIyMjIyBGb3VyLWZhY3RvciBzb2x1dGlvbgoKRm9sbG93aW5nIHRoZSBzdGVwcyBkZXNjcmliZWQgaW4gIkdlbmVyYWwgYW5hbHlzaXMgcGxhbiwiIGFib3ZlLCB5aWVsZGVkIGByIGZhY3RfbmFtZV9mdW4oZmFjdG9yX25hbWVzX2VmYV93ZG1fZDRfNDYpYCBzY2FsZXMgb2YgYHIgc2NhbGVzX2VmYV93ZG1fZDRfNDYgJT4lIGNvdW50KGZhY3RvcikgJT4lIHN1bW1hcmlzZShtZWFuID0gbWVhbihuKSkgJT4lIHNlbGVjdChtZWFuKSAlPiUgYXMubnVtZXJpYygpYCBpdGVtcyBlYWNoOyBzZWUgVGFibGUgNC40LgoKIyMjIyBWaXN1YWxpemF0aW9uCgojIyMjIyBVc2luZyBhZHVsdHMnIHNjYWxlcwoKWFgKCmBgYHtyfQpwbG90c19kNF80Nl9zY29yZWRfYWQgPC0gcmVsdml6X2Z1bihkNF80Nl9zY29yZWRfYWQsIGNvbG9ycyA9IGNvbG9yczAyKQpgYGAKCmBgYHtyfQpmaWdfZDRfNDZfc2NvcmVkX2FkX3Bsb3RzIDwtIHBsb3RfZ3JpZChwbG90c19kNF80Nl9zY29yZWRfYWRbWzFdXSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RzX2Q0XzQ2X3Njb3JlZF9hZFtbMl1dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdHNfZDRfNDZfc2NvcmVkX2FkW1szXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJCMSIsICJCMiIsICJCMyIpLCBuY29sID0gMykKCmZpZ19kNF80Nl9zY29yZWRfYWRfbGVnIDwtIGdldF9sZWdlbmQoCiAgcGxvdHNfZDRfNDZfc2NvcmVkX2FkW1sxXV0gKwogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpICsKICAgIHNjYWxlX2ZpbGxfbWFudWFsKCJUYXJnZXQgY2hhcmFjdGVyIiwgdmFsdWVzID0gY29sb3JzMDIsCiAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZCh0aXRsZS5wb3NpdGlvbiA9ICJsZWZ0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9ICJob3Jpem9udGFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAyKSkgKwogICAgc2NhbGVfY29sb3JfbWFudWFsKCJUYXJnZXQgY2hhcmFjdGVyIiwgdmFsdWVzID0gY29sb3JzMDIsCiAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQodGl0bGUucG9zaXRpb24gPSAibGVmdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gImhvcml6b250YWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAyKSkpCgpmaWdfZDRfNDZfc2NvcmVkX2FkX3Bsb3RzX2xlZyA8LSBwbG90X2dyaWQoZmlnX2Q0XzQ2X3Njb3JlZF9hZF9wbG90cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZ19kNF80Nl9zY29yZWRfYWRfbGVnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygxLCAwLjA1KSkKCmZpZ19kNF80Nl9zY29yZWRfYWRfdGl0bGUgPC0gZ2dkcmF3KCkgKyAKICBkcmF3X2xhYmVsKCJTdHVkeSA0OiBDaGlsZHJlbiwgNC01eSAoc2NvcmVkIHVzaW5nIGFkdWx0cycgc2NhbGVzKSIsIHNpemUgPSAxNiwgZm9udGZhY2UgPSAnYm9sZCcsIHggPSAwLCBoanVzdCA9IDApCgpmaWdfZDRfNDZfc2NvcmVkX2FkX3Bsb3RzX2xlZ190aXRsZSA8LSBwbG90X2dyaWQoCiAgZmlnX2Q0XzQ2X3Njb3JlZF9hZF90aXRsZSwgZmlnX2Q0XzQ2X3Njb3JlZF9hZF9wbG90c19sZWcsCiAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygwLjEyLCAxKSkKYGBgCgojIyMjIyBVc2luZyBjaGlsZHJlbidzIG93biBzY2FsZXMgKHRocmVlLWZhY3RvciBzb2x1dGlvbikKClhYCgpgYGB7cn0KcGxvdHNfZDRfNDZfc2NvcmVkXzQ2X3BhciA8LSByZWx2aXpfZnVuKGQ0XzQ2X3Njb3JlZF80Nl9wYXIsIGNvbG9ycyA9IGNvbG9yczAyKQpgYGAKCmBgYHtyfQpmaWdfZDRfNDZfc2NvcmVkXzQ2X3Bhcl9wbG90cyA8LSBwbG90X2dyaWQocGxvdHNfZDRfNDZfc2NvcmVkXzQ2X3BhcltbMV1dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90c19kNF80Nl9zY29yZWRfNDZfcGFyW1syXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RzX2Q0XzQ2X3Njb3JlZF80Nl9wYXJbWzNdXSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQTEiLCAiQTIiLCAiQTMiKSwgbmNvbCA9IDMpCgpmaWdfZDRfNDZfc2NvcmVkXzQ2X3Bhcl9sZWcgPC0gZ2V0X2xlZ2VuZCgKICBwbG90c19kNF80Nl9zY29yZWRfNDZfcGFyW1sxXV0gKwogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpICsKICAgIHNjYWxlX2ZpbGxfbWFudWFsKCJUYXJnZXQgY2hhcmFjdGVyIiwgdmFsdWVzID0gY29sb3JzMDIsCiAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZCh0aXRsZS5wb3NpdGlvbiA9ICJsZWZ0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9ICJob3Jpem9udGFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAyKSkgKwogICAgc2NhbGVfY29sb3JfbWFudWFsKCJUYXJnZXQgY2hhcmFjdGVyIiwgdmFsdWVzID0gY29sb3JzMDIsCiAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQodGl0bGUucG9zaXRpb24gPSAibGVmdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gImhvcml6b250YWwiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMikpKQoKZmlnX2Q0XzQ2X3Njb3JlZF80Nl9wYXJfcGxvdHNfbGVnIDwtIHBsb3RfZ3JpZCgKICBmaWdfZDRfNDZfc2NvcmVkXzQ2X3Bhcl9wbG90cywgZmlnX2Q0XzQ2X3Njb3JlZF80Nl9wYXJfbGVnLAogIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMSwgMC4wNSkpCgpmaWdfZDRfNDZfc2NvcmVkXzQ2X3Bhcl90aXRsZSA8LSBnZ2RyYXcoKSArIAogIGRyYXdfbGFiZWwoIlN0dWR5IDQ6IENoaWxkcmVuLCA0LTV5IChzY29yZWQgdXNpbmcgdGhlaXIgb3duIHNjYWxlcywgMy1mYWN0b3Igc29sdXRpb24pIiwgc2l6ZSA9IDE2LCBmb250ZmFjZSA9ICdib2xkJywgeCA9IDAsIGhqdXN0ID0gMCkKCmZpZ19kNF80Nl9zY29yZWRfNDZfcGFyX3Bsb3RzX2xlZ190aXRsZSA8LSBwbG90X2dyaWQoCiAgZmlnX2Q0XzQ2X3Njb3JlZF80Nl9wYXJfdGl0bGUsIGZpZ19kNF80Nl9zY29yZWRfNDZfcGFyX3Bsb3RzX2xlZywKICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDAuMTIsIDEpKQpgYGAKCiMjIyMjIFVzaW5nIGNoaWxkcmVuJ3Mgb3duIHNjYWxlcyAoZm91ci1mYWN0b3Igc29sdXRpb24pCgpYWAoKYGBge3J9CnBsb3RzX2Q0XzQ2X3Njb3JlZF80Nl93ZG0gPC0gcmVsdml6X2Z1bihkNF80Nl9zY29yZWRfNDZfd2RtLCBjb2xvcnMgPSBjb2xvcnMwMikKYGBgCgpgYGB7cn0KZmlnX2Q0XzQ2X3Njb3JlZF80Nl93ZG1fcGxvdHMgPC0gcGxvdF9ncmlkKHBsb3RzX2Q0XzQ2X3Njb3JlZF80Nl93ZG1bWzFdXSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdHNfZDRfNDZfc2NvcmVkXzQ2X3dkbVtbMl1dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90c19kNF80Nl9zY29yZWRfNDZfd2RtW1szXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RzX2Q0XzQ2X3Njb3JlZF80Nl93ZG1bWzRdXSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdHNfZDRfNDZfc2NvcmVkXzQ2X3dkbVtbNV1dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90c19kNF80Nl9zY29yZWRfNDZfd2RtW1s2XV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkIxIiwgIkIyIiwgIkIzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCNCIsICJCNSIsICJCNiIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAzKQoKZmlnX2Q0XzQ2X3Njb3JlZF80Nl93ZG1fbGVnIDwtIGdldF9sZWdlbmQoCiAgcGxvdHNfZDRfNDZfc2NvcmVkXzQ2X3dkbVtbMV1dICsKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLCBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKSArCiAgICBzY2FsZV9maWxsX21hbnVhbCgiVGFyZ2V0IGNoYXJhY3RlciIsIHZhbHVlcyA9IGNvbG9yczAyLAogICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQodGl0bGUucG9zaXRpb24gPSAibGVmdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMikpICsKICAgIHNjYWxlX2NvbG9yX21hbnVhbCgiVGFyZ2V0IGNoYXJhY3RlciIsCiAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gY29sb3JzMDIsCiAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQodGl0bGUucG9zaXRpb24gPSAibGVmdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gImhvcml6b250YWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAyKSkpCgpmaWdfZDRfNDZfc2NvcmVkXzQ2X3dkbV9wbG90c19sZWcgPC0gcGxvdF9ncmlkKGZpZ19kNF80Nl9zY29yZWRfNDZfd2RtX3Bsb3RzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZ19kNF80Nl9zY29yZWRfNDZfd2RtX2xlZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDEsIDAuMDUpKQoKZmlnX2Q0XzQ2X3Njb3JlZF80Nl93ZG1fdGl0bGUgPC0gZ2dkcmF3KCkgKyAKICBkcmF3X2xhYmVsKCJTdHVkeSA0OiBDaGlsZHJlbiwgNC01eSAoc2NvcmVkIHVzaW5nIHRoZWlyIG93biBzY2FsZXMsIDQtZmFjdG9yIHNvbHV0aW9uKSIsIHNpemUgPSAxNiwgZm9udGZhY2UgPSAnYm9sZCcsIHggPSAwLCBoanVzdCA9IDApCgpmaWdfZDRfNDZfc2NvcmVkXzQ2X3dkbV9wbG90c19sZWdfdGl0bGUgPC0gcGxvdF9ncmlkKAogIGZpZ19kNF80Nl9zY29yZWRfNDZfd2RtX3RpdGxlLCBmaWdfZDRfNDZfc2NvcmVkXzQ2X3dkbV9wbG90c19sZWcsCiAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygwLjEyLCAxKSkKYGBgCgojIyMjIEFuYWx5c2lzIG9mIGFzeW1tZXRyaWVzCgpgYGB7cn0KZDRfNDZfc2NvcmVkX2FkX2RpZmYgPC0gZGlmZl9mdW4oZDRfNDZfc2NvcmVkX2FkKQpkNF80Nl9zY29yZWRfNDZfcGFyX2RpZmYgPC0gZGlmZl9mdW4oZDRfNDZfc2NvcmVkXzQ2X3BhcikKZDRfNDZfc2NvcmVkXzQ2X3dkbV9kaWZmIDwtIGRpZmZfZnVuKGQ0XzQ2X3Njb3JlZF80Nl93ZG0pCnNhdmVSRFMoZDRfNDZfc2NvcmVkX2FkX2RpZmYsICIuL2RpZmZzY29yZV9kYXRhL2Q0XzQ2X3Njb3JlZF9hZF9kaWZmIikKc2F2ZVJEUyhkNF80Nl9zY29yZWRfNDZfcGFyX2RpZmYsICIuL2RpZmZzY29yZV9kYXRhL2Q0XzQ2X3Njb3JlZF80Nl9wYXJfZGlmZiIpCnNhdmVSRFMoZDRfNDZfc2NvcmVkXzQ2X3dkbV9kaWZmLCAiLi9kaWZmc2NvcmVfZGF0YS9kNF80Nl9zY29yZWRfNDZfd2RtX2RpZmYiKQpgYGAKCiMjIyMjIFVzaW5nIGFkdWx0cycgc2NhbGVzCgpgYGB7cn0KcGxvdF9kNF80Nl9zY29yZWRfYWRfZGlmZiA8LSBkaWZmcGxvdF9mdW4oZDRfNDZfc2NvcmVkX2FkX2RpZmYsIGNvbG9yczAyKQpgYGAKCmBgYHtyfQojIHJfZDRfNDZfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCA8LSBicm0oCiMgICBkaWZmIH4gMSArICgxIHwgY2hhcmFjdGVyKSArICgxIHwgc3ViaWQpLAojICAgZGF0YSA9IGQ0XzQ2X3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIEhFQVJUIiksCiMgICBjb250cmFzdHMgPSBsaXN0KGNoYXJhY3RlciA9IGNvbnRyYXN0c19zdW1fZWRnZSksCiMgICBjb3JlcyA9IDQsIGNvbnRyb2wgPSBsaXN0KGFkYXB0X2RlbHRhID0gMC45OTkpKQoKIyByX2Q0XzQ2X3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQgPC0gbG1lcigKIyAgIGRpZmYgfiAxICsgKDEgfCBjaGFyYWN0ZXIpICsgKDEgfCBzdWJpZCksCiMgICBkYXRhID0gZDRfNDZfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gSEVBUlQiKSwKIyAgIGNvbnRyYXN0cyA9IGxpc3QoY2hhcmFjdGVyID0gY29udHJhc3RzX3N1bV9lZGdlKSkKCnJfZDRfNDZfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCA8LSBsbWVyKAogIGRpZmYgfiAxICsgY2hhcmFjdGVyICsgKDEgfCBzdWJpZCksCiAgZGF0YSA9IGQ0XzQ2X3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIEhFQVJUIiksCiAgY29udHJhc3RzID0gbGlzdChjaGFyYWN0ZXIgPSBjb250cmFzdHNfc3VtX2VkZ2UpKQoKIyByX2Q0XzQ2X3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQgPC0gbG1lcigKIyAgIGRpZmYgfiAxICsgKDEgfCBzdWJpZCksCiMgICBkYXRhID0gZDRfNDZfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gSEVBUlQiKSkKCnN1bW1hcnkocl9kNF80Nl9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUKQpgYGAKCmBgYHtyfQojIHJfZDRfNDZfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIDwtIGJybSgKIyAgIGRpZmYgfiAxICsgKDEgfCBjaGFyYWN0ZXIpICsgKDEgfCBzdWJpZCksCiMgICBkYXRhID0gZDRfNDZfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gTUlORCIpLAojICAgY29udHJhc3RzID0gbGlzdChjaGFyYWN0ZXIgPSBjb250cmFzdHNfc3VtX2VkZ2UpLAojICAgY29yZXMgPSA0LCBjb250cm9sID0gbGlzdChhZGFwdF9kZWx0YSA9IDAuOTk5KSkKCiMgcl9kNF80Nl9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQgPC0gbG1lcigKIyAgIGRpZmYgfiAxICsgKDEgfCBjaGFyYWN0ZXIpICsgKDEgfCBzdWJpZCksCiMgICBkYXRhID0gZDRfNDZfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gTUlORCIpLAojICAgY29udHJhc3RzID0gbGlzdChjaGFyYWN0ZXIgPSBjb250cmFzdHNfc3VtX2VkZ2UpKQoKcl9kNF80Nl9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQgPC0gbG1lcigKICBkaWZmIH4gMSArIGNoYXJhY3RlciArICgxIHwgc3ViaWQpLAogIGRhdGEgPSBkNF80Nl9zY29yZWRfYWRfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFkgLSBNSU5EIiksCiAgY29udHJhc3RzID0gbGlzdChjaGFyYWN0ZXIgPSBjb250cmFzdHNfc3VtX2VkZ2UpKQoKIyByX2Q0XzQ2X3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCA8LSBsbWVyKAojICAgZGlmZiB+IDEgKyAoMSB8IHN1YmlkKSwKIyAgIGRhdGEgPSBkNF80Nl9zY29yZWRfYWRfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFkgLSBNSU5EIikpCgpzdW1tYXJ5KHJfZDRfNDZfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EKQpgYGAKCmBgYHtyfQojIHJfZDRfNDZfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCA8LSBicm0oCiMgICBkaWZmIH4gMSArICgxIHwgY2hhcmFjdGVyKSArICgxIHwgc3ViaWQpLAojICAgZGF0YSA9IGQ0XzQ2X3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiSEVBUlQgLSBNSU5EIiksCiMgICBjb250cmFzdHMgPSBsaXN0KGNoYXJhY3RlciA9IGNvbnRyYXN0c19zdW1fZWRnZSksCiMgICBjb3JlcyA9IDQsIGNvbnRyb2wgPSBsaXN0KGFkYXB0X2RlbHRhID0gMC45OTkpKQoKIyByX2Q0XzQ2X3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQgPC0gbG1lcigKIyAgIGRpZmYgfiAxICsgKDEgfCBjaGFyYWN0ZXIpICsgKDEgfCBzdWJpZCksCiMgICBkYXRhID0gZDRfNDZfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJIRUFSVCAtIE1JTkQiKSwKIyAgIGNvbnRyYXN0cyA9IGxpc3QoY2hhcmFjdGVyID0gY29udHJhc3RzX3N1bV9lZGdlKSkKCnJfZDRfNDZfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCA8LSBsbWVyKAogIGRpZmYgfiAxICsgY2hhcmFjdGVyICsgKDEgfCBzdWJpZCksCiAgZGF0YSA9IGQ0XzQ2X3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiSEVBUlQgLSBNSU5EIiksCiAgY29udHJhc3RzID0gbGlzdChjaGFyYWN0ZXIgPSBjb250cmFzdHNfc3VtX2VkZ2UpKQoKIyByX2Q0XzQ2X3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQgPC0gbG1lcigKIyAgIGRpZmYgfiAxICsgKDEgfCBzdWJpZCksCiMgICBkYXRhID0gZDRfNDZfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJIRUFSVCAtIE1JTkQiKSkKCnN1bW1hcnkocl9kNF80Nl9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EKQpgYGAKClhYCgojIyMjIyBVc2luZyBjaGlsZHJlbidzIG93biBzY2FsZXMgKHRocmVlLWZhY3RvciBzb2x1dGlvbikKCmBgYHtyfQpwbG90X2Q0XzQ2X3Njb3JlZF80Nl9wYXJfZGlmZiA8LSBkaWZmcGxvdF9mdW4oZDRfNDZfc2NvcmVkXzQ2X3Bhcl9kaWZmLCBjb2xvcnMwMikKYGBgCgpgYGB7cn0KIyByX2Q0XzQ2X3Njb3JlZF80Nl9wYXJfZGlmZl9CT0RZX0hFQVJUIDwtIGJybSgKIyAgIGRpZmYgfiAxICsgKDEgfCBjaGFyYWN0ZXIpICsgKDEgfCBzdWJpZCksCiMgICBkYXRhID0gZDRfNDZfc2NvcmVkXzQ2X3Bhcl9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIEhFQVJUIiksCiMgICBjb250cmFzdHMgPSBsaXN0KGNoYXJhY3RlciA9IGNvbnRyYXN0c19zdW1fZWRnZSksCiMgICBjb3JlcyA9IDQsIGNvbnRyb2wgPSBsaXN0KGFkYXB0X2RlbHRhID0gMC45OTkpKQoKIyByX2Q0XzQ2X3Njb3JlZF80Nl9wYXJfZGlmZl9CT0RZX0hFQVJUIDwtIGxtZXIoCiMgICBkaWZmIH4gMSArICgxIHwgY2hhcmFjdGVyKSArICgxIHwgc3ViaWQpLAojICAgZGF0YSA9IGQ0XzQ2X3Njb3JlZF80Nl9wYXJfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFkgLSBIRUFSVCIpLAojICAgY29udHJhc3RzID0gbGlzdChjaGFyYWN0ZXIgPSBjb250cmFzdHNfc3VtX2VkZ2UpKQoKcl9kNF80Nl9zY29yZWRfNDZfcGFyX2RpZmZfQk9EWV9IRUFSVCA8LSBsbWVyKAogIGRpZmYgfiAxICsgY2hhcmFjdGVyICsgKDEgfCBzdWJpZCksCiAgZGF0YSA9IGQ0XzQ2X3Njb3JlZF80Nl9wYXJfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFkgLSBIRUFSVCIpLAogIGNvbnRyYXN0cyA9IGxpc3QoY2hhcmFjdGVyID0gY29udHJhc3RzX3N1bV9lZGdlKSkKCiMgcl9kNF80Nl9zY29yZWRfNDZfcGFyX2RpZmZfQk9EWV9IRUFSVCA8LSBsbWVyKAojICAgZGlmZiB+IDEgKyAoMSB8IHN1YmlkKSwKIyAgIGRhdGEgPSBkNF80Nl9zY29yZWRfNDZfcGFyX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gSEVBUlQiKSkKCnN1bW1hcnkocl9kNF80Nl9zY29yZWRfNDZfcGFyX2RpZmZfQk9EWV9IRUFSVCkKYGBgCgpgYGB7cn0KIyByX2Q0XzQ2X3Njb3JlZF80Nl9wYXJfZGlmZl9CT0RZX01JTkQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyAoMSB8IGNoYXJhY3RlcikgKyAoMSB8IHN1YmlkKSwKIyAgIGRhdGEgPSBkNF80Nl9zY29yZWRfNDZfcGFyX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gTUlORCIpLAojICAgY29udHJhc3RzID0gbGlzdChjaGFyYWN0ZXIgPSBjb250cmFzdHNfc3VtX2VkZ2UpLAojICAgY29yZXMgPSA0LCBjb250cm9sID0gbGlzdChhZGFwdF9kZWx0YSA9IDAuOTk5KSkKCiMgcl9kNF80Nl9zY29yZWRfNDZfcGFyX2RpZmZfQk9EWV9NSU5EIDwtIGxtZXIoCiMgICBkaWZmIH4gMSArICgxIHwgY2hhcmFjdGVyKSArICgxIHwgc3ViaWQpLAojICAgZGF0YSA9IGQ0XzQ2X3Njb3JlZF80Nl9wYXJfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFkgLSBNSU5EIiksCiMgICBjb250cmFzdHMgPSBsaXN0KGNoYXJhY3RlciA9IGNvbnRyYXN0c19zdW1fZWRnZSkpCgpyX2Q0XzQ2X3Njb3JlZF80Nl9wYXJfZGlmZl9CT0RZX01JTkQgPC0gbG1lcigKICBkaWZmIH4gMSArIGNoYXJhY3RlciArICgxIHwgc3ViaWQpLAogIGRhdGEgPSBkNF80Nl9zY29yZWRfNDZfcGFyX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gTUlORCIpLAogIGNvbnRyYXN0cyA9IGxpc3QoY2hhcmFjdGVyID0gY29udHJhc3RzX3N1bV9lZGdlKSkKCiMgcl9kNF80Nl9zY29yZWRfNDZfcGFyX2RpZmZfQk9EWV9NSU5EIDwtIGxtZXIoCiMgICBkaWZmIH4gMSArICgxIHwgc3ViaWQpLAojICAgZGF0YSA9IGQ0XzQ2X3Njb3JlZF80Nl9wYXJfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFkgLSBNSU5EIikpCgpzdW1tYXJ5KHJfZDRfNDZfc2NvcmVkXzQ2X3Bhcl9kaWZmX0JPRFlfTUlORCkKYGBgCgpgYGB7cn0KIyByX2Q0XzQ2X3Njb3JlZF80Nl9wYXJfZGlmZl9IRUFSVF9NSU5EIDwtIGJybSgKIyAgIGRpZmYgfiAxICsgKDEgfCBjaGFyYWN0ZXIpICsgKDEgfCBzdWJpZCksCiMgICBkYXRhID0gZDRfNDZfc2NvcmVkXzQ2X3Bhcl9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiSEVBUlQgLSBNSU5EIiksCiMgICBjb250cmFzdHMgPSBsaXN0KGNoYXJhY3RlciA9IGNvbnRyYXN0c19zdW1fZWRnZSksCiMgICBjb3JlcyA9IDQsIGNvbnRyb2wgPSBsaXN0KGFkYXB0X2RlbHRhID0gMC45OTkpKQoKIyByX2Q0XzQ2X3Njb3JlZF80Nl9wYXJfZGlmZl9IRUFSVF9NSU5EIDwtIGxtZXIoCiMgICBkaWZmIH4gMSArICgxIHwgY2hhcmFjdGVyKSArICgxIHwgc3ViaWQpLAojICAgZGF0YSA9IGQ0XzQ2X3Njb3JlZF80Nl9wYXJfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkhFQVJUIC0gTUlORCIpLAojICAgY29udHJhc3RzID0gbGlzdChjaGFyYWN0ZXIgPSBjb250cmFzdHNfc3VtX2VkZ2UpKQoKcl9kNF80Nl9zY29yZWRfNDZfcGFyX2RpZmZfSEVBUlRfTUlORCA8LSBsbWVyKAogIGRpZmYgfiAxICsgY2hhcmFjdGVyICsgKDEgfCBzdWJpZCksCiAgZGF0YSA9IGQ0XzQ2X3Njb3JlZF80Nl9wYXJfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkhFQVJUIC0gTUlORCIpLAogIGNvbnRyYXN0cyA9IGxpc3QoY2hhcmFjdGVyID0gY29udHJhc3RzX3N1bV9lZGdlKSkKCiMgcl9kNF80Nl9zY29yZWRfNDZfcGFyX2RpZmZfSEVBUlRfTUlORCA8LSBsbWVyKAojICAgZGlmZiB+IDEgKyAoMSB8IHN1YmlkKSwKIyAgIGRhdGEgPSBkNF80Nl9zY29yZWRfNDZfcGFyX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJIRUFSVCAtIE1JTkQiKSkKCnN1bW1hcnkocl9kNF80Nl9zY29yZWRfNDZfcGFyX2RpZmZfSEVBUlRfTUlORCkKYGBgCgpYWAoKIyMjIyMgVXNpbmcgY2hpbGRyZW4ncyBvd24gc2NhbGVzIChmb3VyLWZhY3RvciBzb2x1dGlvbikKCmBgYHtyfQpwbG90X2Q0XzQ2X3Njb3JlZF80Nl93ZG1fZGlmZiA8LSBkaWZmcGxvdF9mdW4oZDRfNDZfc2NvcmVkXzQ2X3dkbV9kaWZmLCBjb2xvcnMwMikKYGBgCgpgYGB7cn0KIyByX2Q0XzQ2X3Njb3JlZF80Nl93ZG1fZGlmZl9CT0RZbmF1c2VhX0JPRFlvdGhlciA8LSBicm0oCiMgICBkaWZmIH4gMSArICgxIHwgY2hhcmFjdGVyKSArICgxIHwgc3ViaWQpLAojICAgZGF0YSA9IGQ0XzQ2X3Njb3JlZF80Nl93ZG1fZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFkgKG5hdXNlYSkgLSBCT0RZIChvdGhlcikiKSwKIyAgIGNvbnRyYXN0cyA9IGxpc3QoY2hhcmFjdGVyID0gY29udHJhc3RzX3N1bV9lZGdlKSwKIyAgIGNvcmVzID0gNCwgY29udHJvbCA9IGxpc3QoYWRhcHRfZGVsdGEgPSAwLjk5OSkpCgojIHJfZDRfNDZfc2NvcmVkXzQ2X3dkbV9kaWZmX0JPRFluYXVzZWFfQk9EWW90aGVyIDwtIGxtZXIoCiMgICBkaWZmIH4gMSArICgxIHwgY2hhcmFjdGVyKSArICgxIHwgc3ViaWQpLAojICAgZGF0YSA9IGQ0XzQ2X3Njb3JlZF80Nl93ZG1fZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFkgKG5hdXNlYSkgLSBCT0RZIChvdGhlcikiKSwKIyAgIGNvbnRyYXN0cyA9IGxpc3QoY2hhcmFjdGVyID0gY29udHJhc3RzX3N1bV9lZGdlKSkKCnJfZDRfNDZfc2NvcmVkXzQ2X3dkbV9kaWZmX0JPRFluYXVzZWFfQk9EWW90aGVyIDwtIGxtZXIoCiAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIgKyAoMSB8IHN1YmlkKSwKICBkYXRhID0gZDRfNDZfc2NvcmVkXzQ2X3dkbV9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAobmF1c2VhKSAtIEJPRFkgKG90aGVyKSIpLAogIGNvbnRyYXN0cyA9IGxpc3QoY2hhcmFjdGVyID0gY29udHJhc3RzX3N1bV9lZGdlKSkKCiMgcl9kNF80Nl9zY29yZWRfNDZfd2RtX2RpZmZfQk9EWW5hdXNlYV9CT0RZb3RoZXIgPC0gbG1lcigKIyAgIGRpZmYgfiAxICsgKDEgfCBzdWJpZCksCiMgICBkYXRhID0gZDRfNDZfc2NvcmVkXzQ2X3dkbV9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAobmF1c2VhKSAtIEJPRFkgKG90aGVyKSIpKQoKc3VtbWFyeShyX2Q0XzQ2X3Njb3JlZF80Nl93ZG1fZGlmZl9CT0RZbmF1c2VhX0JPRFlvdGhlcikKYGBgCgpgYGB7cn0KIyByX2Q0XzQ2X3Njb3JlZF80Nl93ZG1fZGlmZl9CT0RZbmF1c2VhX0hFQVJUIDwtIGJybSgKIyAgIGRpZmYgfiAxICsgKDEgfCBjaGFyYWN0ZXIpICsgKDEgfCBzdWJpZCksCiMgICBkYXRhID0gZDRfNDZfc2NvcmVkXzQ2X3dkbV9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAobmF1c2VhKSAtIEhFQVJUKiIpLAojICAgY29udHJhc3RzID0gbGlzdChjaGFyYWN0ZXIgPSBjb250cmFzdHNfc3VtX2VkZ2UpLAojICAgY29yZXMgPSA0LCBjb250cm9sID0gbGlzdChhZGFwdF9kZWx0YSA9IDAuOTk5KSkKCiMgcl9kNF80Nl9zY29yZWRfNDZfd2RtX2RpZmZfQk9EWW5hdXNlYV9IRUFSVCA8LSBsbWVyKAojICAgZGlmZiB+IDEgKyAoMSB8IGNoYXJhY3RlcikgKyAoMSB8IHN1YmlkKSwKIyAgIGRhdGEgPSBkNF80Nl9zY29yZWRfNDZfd2RtX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIChuYXVzZWEpIC0gSEVBUlQqIiksCiMgICBjb250cmFzdHMgPSBsaXN0KGNoYXJhY3RlciA9IGNvbnRyYXN0c19zdW1fZWRnZSkpCgpyX2Q0XzQ2X3Njb3JlZF80Nl93ZG1fZGlmZl9CT0RZbmF1c2VhX0hFQVJUIDwtIGxtZXIoCiAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIgKyAoMSB8IHN1YmlkKSwKICBkYXRhID0gZDRfNDZfc2NvcmVkXzQ2X3dkbV9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAobmF1c2VhKSAtIEhFQVJUKiIpLAogIGNvbnRyYXN0cyA9IGxpc3QoY2hhcmFjdGVyID0gY29udHJhc3RzX3N1bV9lZGdlKSkKCiMgcl9kNF80Nl9zY29yZWRfNDZfd2RtX2RpZmZfQk9EWW5hdXNlYV9IRUFSVCA8LSBsbWVyKAojICAgZGlmZiB+IDEgKyAoMSB8IHN1YmlkKSwKIyAgIGRhdGEgPSBkNF80Nl9zY29yZWRfNDZfd2RtX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIChuYXVzZWEpIC0gSEVBUlQqIikpCgpzdW1tYXJ5KHJfZDRfNDZfc2NvcmVkXzQ2X3dkbV9kaWZmX0JPRFluYXVzZWFfSEVBUlQpCmBgYAoKYGBge3J9CiMgcl9kNF80Nl9zY29yZWRfNDZfd2RtX2RpZmZfQk9EWW90aGVyX0hFQVJUIDwtIGJybSgKIyAgIGRpZmYgfiAxICsgKDEgfCBjaGFyYWN0ZXIpICsgKDEgfCBzdWJpZCksCiMgICBkYXRhID0gZDRfNDZfc2NvcmVkXzQ2X3dkbV9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAob3RoZXIpIC0gSEVBUlQqIiksCiMgICBjb250cmFzdHMgPSBsaXN0KGNoYXJhY3RlciA9IGNvbnRyYXN0c19zdW1fZWRnZSksCiMgICBjb3JlcyA9IDQsIGNvbnRyb2wgPSBsaXN0KGFkYXB0X2RlbHRhID0gMC45OTkpKQoKIyByX2Q0XzQ2X3Njb3JlZF80Nl93ZG1fZGlmZl9CT0RZb3RoZXJfSEVBUlQgPC0gbG1lcigKIyAgIGRpZmYgfiAxICsgKDEgfCBjaGFyYWN0ZXIpICsgKDEgfCBzdWJpZCksCiMgICBkYXRhID0gZDRfNDZfc2NvcmVkXzQ2X3dkbV9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAob3RoZXIpIC0gSEVBUlQqIiksCiMgICBjb250cmFzdHMgPSBsaXN0KGNoYXJhY3RlciA9IGNvbnRyYXN0c19zdW1fZWRnZSkpCgpyX2Q0XzQ2X3Njb3JlZF80Nl93ZG1fZGlmZl9CT0RZb3RoZXJfSEVBUlQgPC0gbG1lcigKICBkaWZmIH4gMSArIGNoYXJhY3RlciArICgxIHwgc3ViaWQpLAogIGRhdGEgPSBkNF80Nl9zY29yZWRfNDZfd2RtX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIChvdGhlcikgLSBIRUFSVCoiKSwKICBjb250cmFzdHMgPSBsaXN0KGNoYXJhY3RlciA9IGNvbnRyYXN0c19zdW1fZWRnZSkpCgojIHJfZDRfNDZfc2NvcmVkXzQ2X3dkbV9kaWZmX0JPRFlvdGhlcl9IRUFSVCA8LSBsbWVyKAojICAgZGlmZiB+IDEgKyAoMSB8IHN1YmlkKSwKIyAgIGRhdGEgPSBkNF80Nl9zY29yZWRfNDZfd2RtX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIChvdGhlcikgLSBIRUFSVCoiKSkKCnN1bW1hcnkocl9kNF80Nl9zY29yZWRfNDZfd2RtX2RpZmZfQk9EWW90aGVyX0hFQVJUKQpgYGAKCmBgYHtyfQojIHJfZDRfNDZfc2NvcmVkXzQ2X3dkbV9kaWZmX0JPRFluYXVzZWFfTUlORCA8LSBicm0oCiMgICBkaWZmIH4gMSArICgxIHwgY2hhcmFjdGVyKSArICgxIHwgc3ViaWQpLAojICAgZGF0YSA9IGQ0XzQ2X3Njb3JlZF80Nl93ZG1fZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFkgKG5hdXNlYSkgLSBNSU5EKiIpLAojICAgY29udHJhc3RzID0gbGlzdChjaGFyYWN0ZXIgPSBjb250cmFzdHNfc3VtX2VkZ2UpLAojICAgY29yZXMgPSA0LCBjb250cm9sID0gbGlzdChhZGFwdF9kZWx0YSA9IDAuOTk5KSkKCiMgcl9kNF80Nl9zY29yZWRfNDZfd2RtX2RpZmZfQk9EWW5hdXNlYV9NSU5EIDwtIGxtZXIoCiMgICBkaWZmIH4gMSArICgxIHwgY2hhcmFjdGVyKSArICgxIHwgc3ViaWQpLAojICAgZGF0YSA9IGQ0XzQ2X3Njb3JlZF80Nl93ZG1fZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFkgKG5hdXNlYSkgLSBNSU5EKiIpLAojICAgY29udHJhc3RzID0gbGlzdChjaGFyYWN0ZXIgPSBjb250cmFzdHNfc3VtX2VkZ2UpKQoKcl9kNF80Nl9zY29yZWRfNDZfd2RtX2RpZmZfQk9EWW5hdXNlYV9NSU5EIDwtIGxtZXIoCiAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIgKyAoMSB8IHN1YmlkKSwKICBkYXRhID0gZDRfNDZfc2NvcmVkXzQ2X3dkbV9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAobmF1c2VhKSAtIE1JTkQqIiksCiAgY29udHJhc3RzID0gbGlzdChjaGFyYWN0ZXIgPSBjb250cmFzdHNfc3VtX2VkZ2UpKQoKIyByX2Q0XzQ2X3Njb3JlZF80Nl93ZG1fZGlmZl9CT0RZbmF1c2VhX01JTkQgPC0gbG1lcigKIyAgIGRpZmYgfiAxICsgKDEgfCBzdWJpZCksCiMgICBkYXRhID0gZDRfNDZfc2NvcmVkXzQ2X3dkbV9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAobmF1c2VhKSAtIE1JTkQqIikpCgpzdW1tYXJ5KHJfZDRfNDZfc2NvcmVkXzQ2X3dkbV9kaWZmX0JPRFluYXVzZWFfTUlORCkKYGBgCgpgYGB7cn0KIyByX2Q0XzQ2X3Njb3JlZF80Nl93ZG1fZGlmZl9CT0RZb3RoZXJfTUlORCA8LSBicm0oCiMgICBkaWZmIH4gMSArICgxIHwgY2hhcmFjdGVyKSArICgxIHwgc3ViaWQpLAojICAgZGF0YSA9IGQ0XzQ2X3Njb3JlZF80Nl93ZG1fZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFkgKG90aGVyKSAtIE1JTkQqIiksCiMgICBjb250cmFzdHMgPSBsaXN0KGNoYXJhY3RlciA9IGNvbnRyYXN0c19zdW1fZWRnZSksCiMgICBjb3JlcyA9IDQsIGNvbnRyb2wgPSBsaXN0KGFkYXB0X2RlbHRhID0gMC45OTkpKQoKIyByX2Q0XzQ2X3Njb3JlZF80Nl93ZG1fZGlmZl9CT0RZb3RoZXJfTUlORCA8LSBsbWVyKAojICAgZGlmZiB+IDEgKyAoMSB8IGNoYXJhY3RlcikgKyAoMSB8IHN1YmlkKSwKIyAgIGRhdGEgPSBkNF80Nl9zY29yZWRfNDZfd2RtX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIChvdGhlcikgLSBNSU5EKiIpLAojICAgY29udHJhc3RzID0gbGlzdChjaGFyYWN0ZXIgPSBjb250cmFzdHNfc3VtX2VkZ2UpKQoKcl9kNF80Nl9zY29yZWRfNDZfd2RtX2RpZmZfQk9EWW90aGVyX01JTkQgPC0gbG1lcigKICBkaWZmIH4gMSArIGNoYXJhY3RlciArICgxIHwgc3ViaWQpLAogIGRhdGEgPSBkNF80Nl9zY29yZWRfNDZfd2RtX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIChvdGhlcikgLSBNSU5EKiIpLAogIGNvbnRyYXN0cyA9IGxpc3QoY2hhcmFjdGVyID0gY29udHJhc3RzX3N1bV9lZGdlKSkKCiMgcl9kNF80Nl9zY29yZWRfNDZfd2RtX2RpZmZfQk9EWW90aGVyX01JTkQgPC0gbG1lcigKIyAgIGRpZmYgfiAxICsgKDEgfCBzdWJpZCksCiMgICBkYXRhID0gZDRfNDZfc2NvcmVkXzQ2X3dkbV9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAob3RoZXIpIC0gTUlORCoiKSkKCnN1bW1hcnkocl9kNF80Nl9zY29yZWRfNDZfd2RtX2RpZmZfQk9EWW90aGVyX01JTkQpCmBgYAoKYGBge3J9CiMgcl9kNF80Nl9zY29yZWRfNDZfd2RtX2RpZmZfSEVBUlRfTUlORCA8LSBicm0oCiMgICBkaWZmIH4gMSArICgxIHwgY2hhcmFjdGVyKSArICgxIHwgc3ViaWQpLAojICAgZGF0YSA9IGQ0XzQ2X3Njb3JlZF80Nl93ZG1fZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkhFQVJUKiAtIE1JTkQqIiksCiMgICBjb250cmFzdHMgPSBsaXN0KGNoYXJhY3RlciA9IGNvbnRyYXN0c19zdW1fZWRnZSksCiMgICBjb3JlcyA9IDQsIGNvbnRyb2wgPSBsaXN0KGFkYXB0X2RlbHRhID0gMC45OTkpKQoKIyByX2Q0XzQ2X3Njb3JlZF80Nl93ZG1fZGlmZl9IRUFSVF9NSU5EIDwtIGxtZXIoCiMgICBkaWZmIH4gMSArICgxIHwgY2hhcmFjdGVyKSArICgxIHwgc3ViaWQpLAojICAgZGF0YSA9IGQ0XzQ2X3Njb3JlZF80Nl93ZG1fZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkhFQVJUKiAtIE1JTkQqIiksCiMgICBjb250cmFzdHMgPSBsaXN0KGNoYXJhY3RlciA9IGNvbnRyYXN0c19zdW1fZWRnZSkpCgpyX2Q0XzQ2X3Njb3JlZF80Nl93ZG1fZGlmZl9IRUFSVF9NSU5EIDwtIGxtZXIoCiAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIgKyAoMSB8IHN1YmlkKSwKICBkYXRhID0gZDRfNDZfc2NvcmVkXzQ2X3dkbV9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiSEVBUlQqIC0gTUlORCoiKSwKICBjb250cmFzdHMgPSBsaXN0KGNoYXJhY3RlciA9IGNvbnRyYXN0c19zdW1fZWRnZSkpCgojIHJfZDRfNDZfc2NvcmVkXzQ2X3dkbV9kaWZmX0hFQVJUX01JTkQgPC0gbG1lcigKIyAgIGRpZmYgfiAxICsgKDEgfCBzdWJpZCksCiMgICBkYXRhID0gZDRfNDZfc2NvcmVkXzQ2X3dkbV9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiSEVBUlQqIC0gTUlORCoiKSkKCnN1bW1hcnkocl9kNF80Nl9zY29yZWRfNDZfd2RtX2RpZmZfSEVBUlRfTUlORCkKYGBgCgpYWAoKIyMgRGlzY3Vzc2lvbgoKWFgKCmBgYHtyfQpzY2FsZXNfc3R1ZHk0IDwtIGJpbmRfcm93cyhzY2FsZXNfZWZhX3dkbV9kNF9hZCAlPiUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXV0YXRlKHN0dWR5ID0gIkFkdWx0cyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZXNfZWZhX3Bhcl9kNF80NiAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUoc3R1ZHkgPSAiQ2hpbGRyZW4sIDQtNXkgKDMtZmFjdG9yIHNvbHV0aW9uKSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZXNfZWZhX3dkbV9kNF80NiAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUoc3R1ZHkgPSAiQ2hpbGRyZW4sIDQtNXkgKDQtZmFjdG9yIHNvbHV0aW9uKSIpKSAlPiUKICBzZWxlY3QoLWMobG9hZGluZywgb3JkZXIpKSAlPiUKICBkaXN0aW5jdCgpICU+JQogIG11dGF0ZShzdHVkeSA9IGZhY3RvcihzdHVkeSwKICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiQWR1bHRzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2hpbGRyZW4sIDQtNXkgKDMtZmFjdG9yIHNvbHV0aW9uKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNoaWxkcmVuLCA0LTV5ICg0LWZhY3RvciBzb2x1dGlvbikiKSkpICU+JQogIHNwcmVhZChzdHVkeSwgZmFjdG9yKSAlPiUKICBtdXRhdGUodXJfZmFjdG9yID0gaWZlbHNlKCFpcy5uYShgQWR1bHRzYCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYEFkdWx0c2AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoaXMubmEoYENoaWxkcmVuLCA0LTV5ICgzLWZhY3RvciBzb2x1dGlvbilgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgQ2hpbGRyZW4sIDQtNXkgKDMtZmFjdG9yIHNvbHV0aW9uKWAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYENoaWxkcmVuLCA0LTV5ICg0LWZhY3RvciBzb2x1dGlvbilgKSkpICU+JQogIGxlZnRfam9pbihzY2FsZXNfZWZhX3dkbV9kNF9hZCAlPiUgCiAgICAgICAgICAgICAgc2VsZWN0KGNhcGFjaXR5LCBvcmRlcikgJT4lIHJlbmFtZShvcmRlcl9hZCA9IG9yZGVyKSkgJT4lCiAgYXJyYW5nZSh1cl9mYWN0b3IsIG9yZGVyX2FkKSAlPiUKICBzZWxlY3QoLWModXJfZmFjdG9yLCBzdGFydHNfd2l0aCgib3JkZXIiKSkpCmBgYAoKYGBge3J9CnRhYmxlNC40IDwtIHNjYWxlc19zdHVkeTQgJT4lCiAgbXV0YXRlX2FsbChhcy5jaGFyYWN0ZXIpICU+JQogICMgZGVhbCB3aXRoIENoaWxkcmVuLCA0LWZhY3RvciBzb2x1dGlvbgogIG11dGF0ZSh0ZW1wMSA9IGBDaGlsZHJlbiwgNC01eSAoNC1mYWN0b3Igc29sdXRpb24pYCwKICAgICAgICAgdGVtcDIgPSBnc3ViKCJcXCoiLCAiIiwgdGVtcDEpLAogICAgICAgICB0ZW1wMyA9IGNhc2Vfd2hlbigKICAgICAgICAgICB0ZW1wMiA9PSBgQWR1bHRzYCB+ICLinJMiLAogICAgICAgICAgIGlzLm5hKHRlbXAyKSB+ICIiLAogICAgICAgICAgIFRSVUUgfiB0ZW1wMSkpICU+JQogIG11dGF0ZShgQ2hpbGRyZW4sIDQtNXkgKDQtZmFjdG9yIHNvbHV0aW9uKWAgPSB0ZW1wMykgJT4lCiAgc2VsZWN0KC1zdGFydHNfd2l0aCgidGVtcCIpKSAlPiUKICAjIGRlYWwgd2l0aCBDaGlsZHJlbiwgMy1mYWN0b3Igc29sdXRpb24KICBtdXRhdGUodGVtcDEgPSBgQ2hpbGRyZW4sIDQtNXkgKDMtZmFjdG9yIHNvbHV0aW9uKWAsCiAgICAgICAgIHRlbXAyID0gZ3N1YigiXFwqIiwgIiIsIHRlbXAxKSwKICAgICAgICAgdGVtcDMgPSBjYXNlX3doZW4oCiAgICAgICAgICAgdGVtcDIgPT0gYEFkdWx0c2AgfiAi4pyTIiwKICAgICAgICAgICBpcy5uYSh0ZW1wMikgfiAiIiwKICAgICAgICAgICBUUlVFIH4gdGVtcDEpKSAlPiUKICBtdXRhdGUoYENoaWxkcmVuLCA0LTV5ICgzLWZhY3RvciBzb2x1dGlvbilgID0gdGVtcDMpICU+JQogIHNlbGVjdCgtc3RhcnRzX3dpdGgoInRlbXAiKSkgJT4lCiAgbXV0YXRlX2F0KHZhcnMoYEFkdWx0c2ApLAogICAgICAgICAgICBmdW5zKGlmZWxzZShpcy5uYSguKSwgIiIsICLinJMiKSkpICU+JQogIG11dGF0ZV9hdCh2YXJzKHN0YXJ0c193aXRoKCJZb3VuZ2VyIikpLAogICAgICAgICAgICBmdW5zKGlmZWxzZShpcy5uYSguKSwgIiIsIC4pKSkgJT4lCiAgcmVuYW1lKENhcGFjaXR5ID0gY2FwYWNpdHksCiAgICAgICAgIGAzLWZhY3RvciBzb2x1dGlvbmAgPSBgQ2hpbGRyZW4sIDQtNXkgKDMtZmFjdG9yIHNvbHV0aW9uKWAsCiAgICAgICAgIGA0LWZhY3RvciBzb2x1dGlvbmAgPSBgQ2hpbGRyZW4sIDQtNXkgKDQtZmFjdG9yIHNvbHV0aW9uKWApICU+JQogIGthYmxlKGZvcm1hdCA9ICJodG1sIiwKICAgICAgICBjYXB0aW9uID0gIlRhYmxlIDQuNDogU2NhbGVzIGZvciBlYWNoIG9mIHRoZSBjb25jZXB0dWFsIHVuaXRzIChmYWN0b3JzKSBpZGVudGlmaWVkIGJ5IEVGQSBmb3IgVVMgQWR1bHRzIGFuZCBjaGlsZHJlbiBpbiBTdHVkeSA0IChzZWUgQ2hhcHRlciBJSUkpLiBGb3IgY2hpbGRyZW4sIHRoaXMgaW5jbHVkZXMgc2NhbGVzIGZvciBib3RoIHRocmVlLSBhbmQgZm91ci1mYWN0b3IgRUZBIHNvbHV0aW9ucy4gQSBjaGVja21hcmsgaW5kaWNhdGVzIHRoYXQgYSBtZW50YWwgY2FwYWNpdHkgd2FzIGluY2x1ZGVkIGluIGEgc2NhbGUgZm9yIGEgcGFydGljdWxhciBzYW1wbGUuIFRoZSBjb25jZXB0dWFsIHVuaXRzIG9mIHlvdW5nZXIgY2hpbGRyZW4gZGlmZmVyZWQgc3Vic3RhbnRpYWxseSBmcm9tIHRob3NlIG9mIGFkdWx0cywgc3VjaCB0aGF0IHNvbWUgbWVudGFsIGNhcGFjaXRpZXMgd2VyZSBpbmNsdWRlZCBpbiBkaWZmZXJlbnQgc2NhbGVzIGFjcm9zcyBhZ2UgZ3JvdXBzIChlLmcuLCBsb3ZlIHNvbWVvbmUgd2FzIHBhcnQgb2YgdGhlIEhFQVJUIHNjYWxlIGZvciBhZHVsdHMsIGJ1dCBwYXJ0IG9mIHRoZSBNSU5EKiBzY2FsZSBpbiB0aGUgZm91ci1mYWN0b3Igc29sdXRpb24gZm9yIHlvdW5nZXIgY2hpbGRyZW4pLiBJbiB0aGVzZSBjYXNlcywgdGhlIG5hbWUgb2YgdGhlIHNjYWxlIGlzIHByb3ZpZGVkIChyYXRoZXIgdGhhbiBhIGNoZWNrbWFyaykuIikgJT4lCiAga2FibGVfc3R5bGluZygpICU+JQogIGdyb3VwX3Jvd3MoIkJPRFkgc2NhbGUiLCAxLCA1KSAlPiUKICBncm91cF9yb3dzKCJIRUFSVCBzY2FsZSIsIDYsIDEwKSAlPiUKICBncm91cF9yb3dzKCJNSU5EIHNjYWxlIiwgMTEsIDE1KSAlPiUKICBhZGRfaGVhZGVyX2Fib3ZlKGMoIiAiID0gMiwKICAgICAgICAgICAgICAgICAgICAgIkNoaWxkcmVuLCA0LTV5IiA9IDIpKQpgYGAKCmBgYHtyIHRhYmxlNC40LCBpbmNsdWRlID0gVH0KdGFibGU0LjQKYGBgCgpgYGB7cn0KcGxvdHNfYWdlZ3BfZDRfc2NvcmVkX2FkIDwtIHJlbHZpel9hZ2VncF9mdW4oCiAgZF9zY29yZWQgPSBkNF9hZF9zY29yZWRfYWQgJT4lIAogICAgZnVsbF9qb2luKGQ0XzQ2X3Njb3JlZF9hZCksIAogIGFnZV9ncm91cHMgPSBjKCJjaGlsZHJlbjQ2IiwgImFkdWx0cyIpLAogIGFnZV9ncm91cF9sYWJlbHMgPSBjKCJDaGlsZHJlbiwgKDQtNXkpIiwgIkFkdWx0cyIpLAogIGNvbG9ycyA9IGNvbG9yczAyKQpgYGAKCmBgYHtyfQpmaWdfZDRfYWxsX3Njb3JlZF9hZF9wbG90cyA8LSBwbG90X2dyaWQocGxvdHNfYWdlZ3BfZDRfc2NvcmVkX2FkW1sxXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RzX2FnZWdwX2Q0X3Njb3JlZF9hZFtbMl1dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90c19hZ2VncF9kNF9zY29yZWRfYWRbWzNdXSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiRDEiLCAiRDIiLCAiZDQiKSwgbmNvbCA9IDMpCgpmaWdfZDRfYWxsX3Njb3JlZF9hZF9sZWcgPC0gZ2V0X2xlZ2VuZCgKICBwbG90c19hZ2VncF9kNF9zY29yZWRfYWRbWzFdXSArIAogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpICsKICAgIHNjYWxlX2NvbG9yX21hbnVhbCgiVGFyZ2V0IGNoYXJhY3RlciIsIHZhbHVlcyA9IGNvbG9yczAyLCBuYS50cmFuc2xhdGUgPSBGLCAKICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZCh0aXRsZS5wb3NpdGlvbiA9ICJsZWZ0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDIpKSkKCmZpZ19kNF9hbGxfc2NvcmVkX2FkX3Bsb3RzX2xlZyA8LSBwbG90X2dyaWQoZmlnX2Q0X2FsbF9zY29yZWRfYWRfcGxvdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlnX2Q0X2FsbF9zY29yZWRfYWRfbGVnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMSwgMC4wNSkpCgpmaWdfZDRfYWxsX3Njb3JlZF9hZF90aXRsZSA8LSBnZ2RyYXcoKSArIAogIGRyYXdfbGFiZWwoIlRyYWNraW5nIGRldmVsb3BtZW50IGJldHdlZW4gNC01eSBhbmQgYWR1bHRob29kIChzY29yZWQgdXNpbmcgYWR1bHRzJyBzY2FsZXMpIiwgc2l6ZSA9IDE2LCBmb250ZmFjZSA9ICdib2xkJywgeCA9IDAsIGhqdXN0ID0gMCkKCmZpZ19kNF9hbGxfc2NvcmVkX2FkX3Bsb3RzX2xlZ190aXRsZSA8LSBwbG90X2dyaWQoCiAgZmlnX2Q0X2FsbF9zY29yZWRfYWRfdGl0bGUsIGZpZ19kNF9hbGxfc2NvcmVkX2FkX3Bsb3RzX2xlZywKICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDAuMTIsIDEpKQpgYGAKCmBgYHtyfQpmaWd1cmU0LjEyIDwtIHBsb3RfZ3JpZChmaWdfZDRfYWRfcGxvdHNfbGVnX3RpdGxlLCAKICAgICAgICAgICAgICAgICAgICAgICAgZmlnX2Q0XzQ2X3Njb3JlZF9hZF9wbG90c19sZWdfdGl0bGUsCiAgICAgICAgICAgICAgICAgICAgICAgIGZpZ19kNF9hbGxfc2NvcmVkX2FkX3Bsb3RzX2xlZ190aXRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEpCgpmaWd1cmU0LjEyX2NhcCA8LSBhZGRfc3ViKGZpZ3VyZTQuMTIsIHN0cl93cmFwKCJGaWd1cmUgNC4xMjogUmVsYXRpb25zaGlwcyBhbW9uZyBVUyBhZHVsdHMnIGFuZCBjaGlsZHJlbidzIGF0dHJpYnV0aW9ucyBvZiBjb25jZXB0dWFsIHVuaXRzIGluIFN0dWR5IDQsIHNjb3JlZCB1c2luZyBhZHVsdHMnIEJPRFksIEhFQVJULCBhbmQgTUlORCBzY2FsZXMgKHNlZSBUYWJsZSA0LjQpLiAoQSkgQWR1bHRzLiAoQikgQ2hpbGRyZW4gKDQtNXkgb2YgYWdlKS4gKEMpIEEgdmlzdWFsaXphdGlvbiBvZiBkZXZlbG9wbWVudCBiZXR3ZWVuIDQtNXkgYW5kIGFkdWx0aG9vZCwgdXNpbmcgbWVhbiBzY29yZXMgYnkgY2hhcmFjdGVyIGFuZCBhZ2UgZ3JvdXAuIFBsb3RzIGFyZSBvcmdhbml6ZWQgYnkgc2FtcGxlIChyb3dzKSBhbmQgYnkgcGFpciBvZiBjb25jZXB0dWFsIHVuaXRzIChjb2x1bW5zKS4gRm9yIGVhY2ggY29uY2VwdHVhbCB1bml0LCBzY29yZXMgY291bGQgcmFuZ2UgZnJvbSAwLTEuIEluIHBhbmVscyBBLUIsIGluZGl2aWR1YWwgcGFydGljaXBhbnRzIGFyZSBwbG90dGVkIGFzIHNtYWxsLCB0cmFuc2x1Y2VudCBjaXJjbGVzLCBhbmQgbWVhbiBzY29yZXMgYnkgY2hhcmFjdGVyIGFyZSBwbG90dGVkIGFzIGxhcmdlciwgc29saWQgZGlhbW9uZHMuIEVycm9yIGJhcnMgYXJlIDk1JSBib290c3RyYXBwZWQgY29uZmlkZW5jZSBpbnRlcnZhbHMuIFRoZSBkb3R0ZWQgbGluZSBjb3JyZXNwb25kcyB0byBlcXVhbCBlbmRvcnNlbWVudHMgb2YgdGhlIHR3byBjb25jZXB0dWFsIHVuaXRzIHBsb3R0ZWQuIiwgMTEwKSwgeCA9IDAsIGhqdXN0ID0gMCkKYGBgCgpgYGB7ciwgaW5jbHVkZSA9IFQsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAxLjR9CmdnZHJhdyhmaWd1cmU0LjEyX2NhcCkKYGBgCgpgYGB7cn0KZmlndXJlNC4xMyA8LSBwbG90X2dyaWQoZmlnX2Q0XzQ2X3Njb3JlZF80Nl9wYXJfcGxvdHNfbGVnX3RpdGxlLCAKICAgICAgICAgICAgICAgICAgICAgICAgZmlnX2Q0XzQ2X3Njb3JlZF80Nl93ZG1fcGxvdHNfbGVnX3RpdGxlLAogICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDEsIDIpKQoKZmlndXJlNC4xM19jYXAgPC0gYWRkX3N1YihmaWd1cmU0LjEzLCBzdHJfd3JhcCgiRmlndXJlIDQuMTM6IFJlbGF0aW9uc2hpcHMgYW1vbmcgVVMgYWR1bHRzJywgb2xkZXIgY2hpbGRyZW4ncywgYW5kIHlvdW5nZXIgY2hpbGRyZW4ncyBhdHRyaWJ1dGlvbnMgb2YgY29uY2VwdHVhbCB1bml0cyBpbiBTdHVkeSAzLCBzY29yZWQgdXNpbmcgdGhlaXIgb3duIHNjYWxlcyBzY2FsZXMgKHNlZSBUYWJsZSA0LjQpLiBUdHdvIHNldHMgb2Ygc2NvcmVzIGFyZSBwcmVzZW50ZWQ6IHVzaW5nIGEgdGhyZWUtZmFjdG9yIEVGQSBzb2x1dGlvbiAoQTEtQTMpIGFuZCB1c2luZyBhIGZvdXItZmFjdG9yIEVGQSBzb2x1dGlvbiAoQjEtQjYpLiBQbG90cyBhcmUgb3JnYW5pemVkIGJ5IHNjYWxlIHVzZWQgKHJvd3MpIGFuZCBieSBwYWlyIG9mIGNvbmNlcHR1YWwgdW5pdHMgKGNvbHVtbnMpLiBGb3IgZWFjaCBjb25jZXB0dWFsIHVuaXQsIHNjb3JlcyBjb3VsZCByYW5nZSBmcm9tIDAtMS4gSW5kaXZpZHVhbCBwYXJ0aWNpcGFudHMgYXJlIHBsb3R0ZWQgYXMgc21hbGwsIHRyYW5zbHVjZW50IGNpcmNsZXMsIGFuZCBtZWFuIHNjb3JlcyBieSBjaGFyYWN0ZXIgYXJlIHBsb3R0ZWQgYXMgbGFyZ2VyLCBzb2xpZCBkaWFtb25kcy4gRXJyb3IgYmFycyBhcmUgOTUlIGJvb3RzdHJhcHBlZCBjb25maWRlbmNlIGludGVydmFscy4gVGhlIGRvdHRlZCBsaW5lIGNvcnJlc3BvbmRzIHRvIGVxdWFsIGVuZG9yc2VtZW50cyBvZiB0aGUgdHdvIGNvbmNlcHR1YWwgdW5pdHMgcGxvdHRlZC4iLCAxMTApLCB4ID0gMCwgaGp1c3QgPSAwKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gVCwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDEuMzV9CmdnZHJhdyhmaWd1cmU0LjEzX2NhcCkKYGBgCgpgYGB7cn0KZmlndXJlNC4xNF9wbG90cyA8LSBwbG90X2dyaWQoCiAgcGxvdF9kNF9hZF9zY29yZWRfYWRfZGlmZiArCiAgICBsYWJzKHRpdGxlID0gIlN0dWR5IDQ6IEFkdWx0cyIpICsKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSwKICBwbG90X2Q0XzQ2X3Njb3JlZF9hZF9kaWZmICsgCiAgICBsYWJzKHRpdGxlID0gIlN0dWR5IDQ6IENoaWxkcmVuLCA0LTZ5IChzY29yZWQgdXNpbmcgYWR1bHRzJyBzY2FsZXMpIikgKwogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpLCAKICBuY29sID0gMiwgcmVsX3dpZHRocyA9IGMoMSwgMSksCiAgbGFiZWxzID0gIkFVVE8iKQoKZmlndXJlNC4xNF9jYXAgPC0gYWRkX3N1YihmaWd1cmU0LjE0X3Bsb3RzLCBzdHJfd3JhcCgiRmlndXJlIDQuMTQ6IERpZmZlcmVuY2Ugc2NvcmVzIGJldHdlZW4gVVMgYWR1bHRzJyBhbmQgY2hpbGRyZW4ncyBhdHRyaWJ1dGlvbnMgb2YgY29uY2VwdHVhbCB1bml0cyBpbiBTdHVkeSA0LiBGb3IgZWFjaCBjb25jZXB0dWFsIHVuaXQsIHNjb3JlcyBjb3VsZCByYW5nZSBmcm9tIDAtMSwgc3VjaCB0aGF0IGRpZmZlcmVuY2Ugc2NvcmVzIGNvdWxkIHJhbmdlIGZyb20gLTEgdG8gKzEuIEluZGl2aWR1YWwgcGFydGljaXBhbnRzIGFyZSBwbG90dGVkIGFzIHNtYWxsLCB0cmFuc2x1Y2VudCBjaXJjbGVzLCBhbmQgbWVhbiBkaWZmZXJlbmNlIHNjb3JlcyBieSBjaGFyYWN0ZXIgYXJlIHBsb3R0ZWQgYXMgbGFyZ2VyLCBzb2xpZCBkaWFtb25kcy4gRXJyb3IgYmFycyBhcmUgOTUlIGJvb3RzdHJhcHBlZCBjb25maWRlbmNlIGludGVydmFscy4gVGhlIGRvdHRlZCBsaW5lIGNvcnJlc3BvbmRzIHRvIGVxdWFsIGVuZG9yc2VtZW50cyBvZiB0aGUgdHdvIGNvbmNlcHR1YWwgdW5pdHMgcGxvdHRlZCAoaS5lLiwgYSBkaWZmZXJlbmNlIHNjb3JlIG9mIDApLiIsIDE4MCksIHggPSAwLCBoanVzdCA9IDApCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBULCBmaWcud2lkdGggPSA4LCBmaWcuYXNwID0gMC4zOH0KZ2dkcmF3KGZpZ3VyZTQuMTRfY2FwKQpgYGAKCmBgYHtyfQpmaWd1cmU0LjE1X3Bsb3RzIDwtIHBsb3RfZ3JpZCgKICBwbG90X2Q0XzQ2X3Njb3JlZF80Nl9wYXJfZGlmZiArIAogICAgbGFicyh0aXRsZSA9ICJTdHVkeSA0OiBDaGlsZHJlbiwgNC02eVxuKHNjb3JlZCB1c2luZyB0aGVpciBvd24gc2NhbGVzLCAzLWZhY3RvciBzb2x1dGlvbikiKSArCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiksIAogIHBsb3RfZDRfNDZfc2NvcmVkXzQ2X3dkbV9kaWZmICsgCiAgICBsYWJzKHRpdGxlID0gIlN0dWR5IDQ6IENoaWxkcmVuLCA0LTZ5XG4oc2NvcmVkIHVzaW5nIHRoZWlyIG93biBzY2FsZXMsIDQtZmFjdG9yIHNvbHV0aW9uKSIpICsKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSwgCiAgbmNvbCA9IDIsIHJlbF93aWR0aHMgPSBjKDEsIDIpLAogIGxhYmVscyA9ICJBVVRPIikKCmZpZ3VyZTQuMTVfY2FwIDwtIGFkZF9zdWIoZmlndXJlNC4xNV9wbG90cywgc3RyX3dyYXAoIkZpZ3VyZSA0LjE1OiBEaWZmZXJlbmNlIHNjb3JlcyBiZXR3ZWVuIDQtIHRvIDUteWVhci1vbGQgY2hpbGRyZW4ncyBhdHRyaWJ1dGlvbnMgb2YgY29uY2VwdHVhbCB1bml0cyBpbiBTdHVkeSA0LCB1c2luZyB0aGVpciBvd24gc2NhbGVzLiBUaGlzIGluY2x1ZGVzIGRpZmZlcmVuY2Ugc2NvcmVzIHVzaW5nIHRoZSB0aHJlZS1mYWN0b3IgRUZBIHNvbHV0aW9uIChwYW5lbCBBKSBhbmQgZGlmZmVyZW5jZSBzY29yZXMgdXNpbmcgdGhlIGZvdXItZmFjdG9yIHNvbHV0aW9uIChwYW5lbCBCOyBzZWUgVGFibGUgNC40KS4gRm9yIGVhY2ggY29uY2VwdHVhbCB1bml0LCBzY29yZXMgY291bGQgcmFuZ2UgZnJvbSAwLTEsIHN1Y2ggdGhhdCBkaWZmZXJlbmNlIHNjb3JlcyBjb3VsZCByYW5nZSBmcm9tIC0xIHRvICsxLiBJbmRpdmlkdWFsIHBhcnRpY2lwYW50cyBhcmUgcGxvdHRlZCBhcyBzbWFsbCwgdHJhbnNsdWNlbnQgY2lyY2xlcywgYW5kIG1lYW4gZGlmZmVyZW5jZSBzY29yZXMgYnkgY2hhcmFjdGVyIGFyZSBwbG90dGVkIGFzIGxhcmdlciwgc29saWQgZGlhbW9uZHMuIEVycm9yIGJhcnMgYXJlIDk1JSBib290c3RyYXBwZWQgY29uZmlkZW5jZSBpbnRlcnZhbHMuIFRoZSBkb3R0ZWQgbGluZSBjb3JyZXNwb25kcyB0byBlcXVhbCBlbmRvcnNlbWVudHMgb2YgdGhlIHR3byBjb25jZXB0dWFsIHVuaXRzIHBsb3R0ZWQgKGkuZS4sIGEgZGlmZmVyZW5jZSBzY29yZSBvZiAwKS4iLCAxODApLCB4ID0gMCwgaGp1c3QgPSAwKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gVCwgZmlnLndpZHRoID0gOCwgZmlnLmFzcCA9IDAuMzh9CmdnZHJhdyhmaWd1cmU0LjE1X2NhcCkKYGBgCgoKIyBHZW5lcmFsIGRpc2N1c3Npb24KClhYCgoKIyBDaGFwdGVyIGNvbmNsdXNpb24KCkluIHRoaXMgY2hhcHRlciwgSSBleHBsb3JlZCBhIHNlY29uZCBhc3BlY3Qgb2YgY29uY2VwdHVhbCByZXByZXNlbnRhdGlvbnMgb2YgbWVudGFsIGxpZmUgYW1vbmcgVVMgY2hpbGRyZW4gYW5kIGFkdWx0czogVGhlIHJlbGF0aW9uc2hpcHMgYW1vbmcgY29uY2VwdHVhbCB1bml0cy4gU3R1ZGllcyAyLTQgYXJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgZm9sbG93aW5nIHRoZW9yeTogWFguIAoKQXMgaW4gQ2hhcHRlciBJSUksIEkgdXJnZSB0aGUgcmVhZGVyIHRvIHJlbWVtYmVyIHRoYXQgdGhpcyBpcyBub3QgdGhlIG9ubHkgcG9zc2libGUgaW50ZXJwcmV0YXRpb24gb2YgdGhlIHBhdHRlcm4gb2YgcmVzdWx0cyBwcmVzZW50ZWQgaGVyZTsgYWRkaXRpb25hbCBzdHVkaWVz4oCUaW4gcGFydGljdWxhciwgc3R1ZGllcyBkZXNpZ25lZCB0byB0ZXN0IHRoZSBoeXBvdGhlc2lzIHRoYXQgWFjigJQgY291bGQgcHJvdmlkZSBjb252ZXJnaW5nIGV2aWRlbmNlIG9yIGNvdWxkIGNoYWxsZW5nZSB0aGlzIHRoZW9yZXRpY2FsIGludGVycHJldGF0aW9uLiBJbnN0ZWFkLCB0aGUgcHJpbWFyeSByb2xlIG9mIHRoZSByZS1hbmFseXNpcyBkaXNjdXNzZWQgaGVyZSBoYXMgYmVlbiB0byBpbnNwaXJlIHRoZSBoeXBvdGhlc2lzIHN0YXRlZCBpbiB0aGUgcHJldmlvdXMgcGFyYWdyYXBoIGFuZCB0byB0aGUgZm91bmRhdGlvbiBmb3IgZnV0dXJlIHRlc3RzIG9mIHRoaXMgaHlwb3RoZXNpcywgaW4gdHVybiByZWZpbmluZyBhIGdlbmVyYWwgdGhlb3J5IG9mIHRoaXMgYXNwZWN0IG9mIGNvbmNlcHR1YWwgZGV2ZWxvcG1lbnQuICAKCkluIHRoZSBuZXh0IGNoYXB0ZXIsIEkgYXBwbHkgdGhlIHNhbWUgZXhwbG9yYXRvcnkgc3Bpcml0IHRvIHRoZSB0aGlyZCBhbmQgZmluYWwgYXNwZWN0IG9mIGNvbmNlcHR1YWwgcmVwcmVzZW50YXRpb25zIG9mIG1lbnRhbCBsaWZlOiB0aGUgYXBwbGljYXRpb24gb3IgZGVwbG95bWVudCBvZiB0aGVzZSBjb25jZXB0dWFsIHVuaXRzIGluIHJlYXNvbmluZyBhYm91dCB2YXJpb3VzIGtpbmRzIG9mIGJlaW5ncy4KCgojIFRPIERPCgotIGltcGxlbWVudCBvdmVyYWxsIHBsYW4KICAgIC0gc3R1ZHkgMTogYWR1bHRzIGZvciBlYWNoIHNhbXBsZSA9IDQgcmVncyB0b3RhbAogICAgLSBzdHVkeSAyOiBhZHVsdHMgZm9yIGVhY2ggc2FtcGxlICgyKTsgY2hpbGRyZW4ncyBmb3IgY2hpbGQgc2FtcGxlICgxKTsgY29tcGFyaXNvbiAoMSkgPSA0IHJlZ3MgdG90YWwKICAgIC0gc3R1ZHkgMzogYWR1bHRzIGZvciBlYWNoIHNhbXBsZSAoMyk7IGNvbXBhcmlzb24gKDEpID0gNCByZWdzIHRvdGFsCiAgICAtIHN0dWR5IDQ6IGFkdWx0cyBmb3IgZWFjaCBzYW1wbGUgKDIpOyBjb21wYXJpc29uICgxKSA9IDMgcmVncyB0b3RhbCAKLSBtYWtlIHJlZ3Jlc3Npb24gdGFibGVzCiAgICAtIHN0dWR5IDEgKDQgcmVnczogc3R1ZGllcyAxYS0xZCkKICAgIC0gc3R1ZHkgMiAoMyByZWdzOiBhZHVsdCBzY2FsZXMgZm9yIGFkdWx0cywgY2hpbGRyZW47IGNoaWxkIHNjYWxlcykKICAgIC0gc3R1ZHkgMiAoMSByZWc6IGRldmVsb3BtZW50YWwgY29tcGFyaXNvbikKICAgIC0gc3R1ZHkgMyAoMyByZWdzOiBhZHVsdCBzY2FsZXMgZm9yIGFkdWx0cywgb2xkZXIsIHlvdW5nIGNoaWxkcmVuKQogICAgLSBzdHVkeSAzICgxIHJlZzogZGV2ZWxvcG1lbnRhbCBjb21wYXJpc29uKQogICAgLSBzdHVkeSA0ICgyIHJlZ3M6IGFkdWx0IHNjbGVzIGZvciBhZHVsdHMsIGNoaWxkcmVuKQogICAgLSBzdHVkeSA0ICgxIHJlZzogZGV2ZWxvcG1lbnRhbCBjb21wYXJpc29uKQotIG1vdmUgdG8gYXBwZW5kaXgKICAgIC0gc3R1ZHkgMjogYWR1bHRzJyA0LWZhY3RvciBzb2x1dGlvbiBmb3IgYWR1bHRzPyBmb3IgNy05eW8/CiAgICAtIHN0dWR5IDM6IDctOXlvIGZvciA3LTl5byAoMSk7IDQtNnlvIGZvciA0LTZ5byB4IDIgKDIpCiAgICAtIHN0dWR5IDQ6IDQtNnlvIGZvciA0LTZ5byB4IDIgKDIpCi0gcmVjb25zaWRlciBhZGRpbmcgdG8gYXBwZW5kaXgKICAgIC0gc3R1ZHkgMzogNy05eW8gZm9yIDQtNnlvPwogICAgLSBhbGwgc3R1ZGllczogY29tcGFyaXNvbnMgYWNyb3NzIHBhaXJzIG9mIHVuaXRzIChpbnN0ZWFkIG9mIHNlcGFyYXRlIHJlZ3MgZm9yIGVhY2ggdW5pdCk/CiAgICAKCgoK